SDK使用方法

初始化

  • 在APPDelegate中初始化SDK。(必须配置)
/**
/// 初始化SDK(带调试环境,推荐使用)
/// @param appid 开放平台注册获取应用Appid  (必传)
/// @param privateKey 开放平台注册获取应用privateKey  家庭版可为空
/// @param env 环境类型 参考<AMOEnvironment>
- (void)initSDKWithAppId:(nonnull NSString *)appid
              privateKey:(nullable NSString *)privateKey
                     env:(AMOEnvironment)env;

//调用示例
AMOSDKManager * andmuManager = [AMOSDKManager sharedInstance];
[andmuManager initSDKWithAppId:@"开放平台获取的appId" privateKey:@”开放平台获取的PrivateKey“ serverPro:YES];

在初始化SDK前必须配置下列方法(推荐appdelegate中)

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    // Override point for customization after application launch.
    
    //必须配置
    signal(SIGPIPE, SIG_IGN);
}
  • 设置开启调试模式(可不设置)
/// 控制台日志输出控制(默认关闭)
/// @param enable 开关参数  YES 默认为AMOLogLevel_default  如需改变日志等级 - (void) setLogLevel:方法
- (void)setDebug:(BOOL)enable;å
 
/// 日志等级(配置setDebug接口方法为true后生效)
/// @param level debug类型
///AMOLogLevelDefault    = 0,                     //AndMuOpenSDK基础日志
///AMOLogLevelInterface  = 1 << 0,                //接口相关日志
///AMOLogLevelPlayer     = 1 << 1,                //播放器相关日志
///AMOLogLevelAll       = AMOLogLevelDefault | AMOLogLevelInterface | AMOLogLevelPlayer //所有日志
- (void)setLogLevel:(AMOLogLevel)level;

登录

  • 设置需要校验的Token(必须配置)

token通过自有平台从视频能力开放平台提供的api获取

https://open.andmu.cn/doc/api/api-list.html#获取token-基础应用、专业版

/**
 配置App端token

 @param authToken 鉴权token
*/
- (void )setSDKAuthToken:(NSString *)authToken;

//调用示例
//注入token
[[AMOSDKManager sharedInstance] setSDKAuthToken:token];

在token无效(调用SDK接口返回的错误码为11503或者11504)、绑定设备及解绑设备后需要重新获取token并调用上面方法。

视频直播

  • 注入设备列表

    设备列表需要调用平台的接口然后注入给SDK

    https://open.andmu.cn/doc/api/api-list.html#获取设备列表

//缓存数据添加
AMOCameraCache *cache = [[AMOCameraCache alloc]init];
cache.deviceId = device.deviceId;
[[AMOCameraManager sharedInstance] addCameraInfo:cache];

  • 开启会话

直播前需要建立链接

/**
* 有回调的连接
*/
//建立连接      
 [[AMOCameraManager sharedInstance] connect:deviceId completion:^(BOOL isSucceeded, id  _Nullable response, NSError * _Nullable error) {
   
        }];
  • 直播

1、播放器配置及播放 在播放前必须完成 “注入设备列表”

//测试缓存数据添加
AMOCameraCache *cache = [[AMOCameraCache alloc]init];
cache.deviceId = device.deviceId;
[[AMOCameraManager sharedInstance] addCameraInfo:cache];
AMOPlayerConfig *playerConfig = [[AMOPlayerConfig alloc]init];
    
//是否主动降噪
playerConfig.isRnnoise = true;
AMOCameraInfo *cameaInfo = [[AMOCameraInfo alloc]init];
cameaInfo.deviceId = self.cameraInfo.deviceId;
AMOPlayer *player = [[AMOPlayer alloc]initWithDeviceId:cameaInfo.deviceId config:playerConfig];
player.delegate = self;

//播放状态监听方法<AMOPlayerDelegate>
///播放器状态
- (void)amPlayerStatusChanged:(AMOPlayerStatus)playerStatus code:(AMOPlayerErrorCode)code {
    NSLog(@"demo AMOPlayerStatus = %lu code = %ld 当前是否直播 = %@",(unsigned long)playerStatus, code);
}

//播放
[self.player prepare];
[self.player start];

播放器状态监听回调说明

///播放器状态
typedef NS_ENUM(NSInteger, AMOPlayerStatus) {
    ///常规播放器状态
    AMOPlayerStatusError = -1,        //错误
    AMOPlayerStatusIdle = 0,          //初始状态
    AMOPlayerStatusPreparing = 1,     //准备中
    AMOPlayerStatusPrepared = 2,      //准备完成
    AMOPlayerStatusBuffering = 3,     //缓冲中
    AMOPlayerStatusBuffered = 4,      //缓冲完成
    AMOPlayerStatusPlaying = 5,       //正在播放
    AMOPlayerStatusPaused = 6,        //暂停
    AMOPlayerStatusStoped = 7,        //停止
    AMOPlayerStatusCompleted = 8,     //完成
    
    ///播放器异常回调状态
    AMOPlayerStatusControlError = 9,  //播放器控制异常回调(具体类型参考AMOPlayerErrorCode)
};

///播放器异常回调code
typedef NS_ENUM(NSInteger, AMOPlayerErrorCode) {
    ///常规播放器状态
    AMOErrorCodePlayerError       =   100005,       //播放器异常
    AMOErrorCodeReplayComplete    =   100018,       //播放器播放完成
    AMOErrorCodeLocalPlayUrl      =   100020,       //本地回放链接失败
    AMOErrorCodeLocalPlayControl  =   100021,       //本地回放控制失败
};

2、暂停播放

[self.player pause];

3、恢复播放

[self.player resume];

4、语音通话

使用该功能必须在直播状态下使用,当处于通话状态时例如回后台或离开当前语音通话页面应停止语音通话。

//开始通话 isDuplexTalk 根据摄像机能力集配置是否双工,双工YES
[self.player startAudioTalk:self.currentAbility.supportDuplexAudioTalk];
//结束通话
[self.player stopAudioTalk];
 
// AMOPlayerDelegate 代理方法监听播放状态
- (void)amPlayerAPIStatusHandled:(AMOPlayerAPIType)apiType isSuccess:(BOOL)isSuccess{
 
 }

语音状态监听说明

///语音状态
typedef NS_ENUM(NSUInteger, AMOAudioState) {
    AMOAudioStateAvailable = 0,  //可进行通话
    AMOAudioStateUnAvailable = 1, //不可进行通话
    AMOAudioStateError, //异常主动终止
};

5、释放播放器

[self.player releasePlayer];

6、倍速播放

///倍速播放
///目前支持(0.5 1 2 4 8 16 32)
///gb设备sd卡倍速目前支持(0.5 1 2 4 )
- (void)setPlaySpeed:(float)speed;

7、播放器静音

//设置静音
- (void)setMute:(BOOL)isMute;

8、通话变声

//语言对讲变声功能
- (BOOL)audioBufferVoiceConversion:(float)value;

9、获取当前播放时间

//获取当前播放时间
- (double)getCurrentTime;

10、切换为直播

//切换为直播
- (void)switchToLive;

11、设置点播url

/// 剪辑播放配置
/// @param url 剪辑地址
- (void)setPlayUrl:(nonnull NSString *)url;

12、重新开始

/// restart
- (void)reStart;

13、设置告警信息

/// 告警播放
/// @param eventInfo 告警数据
- (void)setEventInfo:(nonnull AMOTimeLineEvent *)eventInfo;

14、获取当前通话音量

//当前语音通话音量
- (long)getRecordVolume;

15、是否操作手势

/// 添加手势
- (void)addGestureRecognizer;
  • 断开会话

在完成对摄像头操作后需要断开会话

//断开连接
[[AMOCameraManager sharedInstance] disConnect];

视频回看

::: 直播和回放互相切换无需重新初始化播放器,直接进行 seek **,回放部分初始化与释放阶段与直播类似,这一节只概述回放相关的细节,详细示例参见

首先要通过下面接口获取回放片段用以绘制 :::

  • 云回放片段
#pragma mark -- 云回放
/// 获取云存储timeLineSecion
/// @param deviceId 设备Id Y
/// @param startTime 过滤开始时间,单位毫秒 13位时间戳  N
/// @param endTime 过滤结束时间 ,单位毫秒 13位时间戳  N
/// @param shareId 分享id N
/// @param completion 回调 Y  response<NSArray<AMOTimeLineSection>>
- (void)getTimelineSectionList:(nonnull NSString *)deviceId
                     startTime:(nullable NSNumber *)startTime
                       endTime:(nullable NSNumber *)endTime
                       shareId:(nullable NSString *)shareId
                    completion:(AndMuHttpInterFaceCompletionHandler)completion;
  • SD卡回放片段
/// 通过sd卡获取timelineSection
/// @param deviceId 设备id
/// @param startTime 过滤开始时间,单位毫秒 13位时间戳 Y
/// @param endTime 过滤结束时间 ,单位毫秒 13位时间戳  Y
/// @param completion 回调 Y  response<NSArray<AMOTimeLineSection>>
- (void)getSdcardTimelineSectionList:(nonnull NSString *)deviceId
                           startTime:(nonnull NSNumber *)startTime
                             endTime:(nonnull NSNumber *)endTime
                          completion:(AndMuHttpInterFaceCompletionHandler)completion;
  • AMOTimeLineSection说明如下
@interface AMOTimeLineSection : NSObject

@property (nonatomic, copy) NSString *videoId;
@property (nonatomic, strong) NSDate *startTime;
@property (nonatomic, strong) NSDate *endTime;

在选择了某个时间点后调用如下方法进行播放 (回放,单位ms):

/// 回放到指定时间
/// @param timeInterval 时间戳 单位ms
- (void)seek:(NSTimeInterval)timeInterval;

从指定时间开始播放(回放,单位ms):

/// 回放到指定时间段
/// @param startTimeInterval 开始时间 单位ms
/// @param endTimeInterval 结束时间 单位ms
- (void)seek:(NSTimeInterval)startTimeInterval endTime:(NSTimeInterval)endTimeInterval;

//示例
//startTime NSdate 起始时间
//获取想要回放到的时间戳,注意需要有数据的回放片段才能回放
//sd卡
[self.player seek:[startTime timeIntervalSince1970] * 1000 timelineDataType:AMOTimeLineDataTypeSDCard];
//云存储
[self.player seek:[startTime timeIntervalSince1970] * 1000 timelineDataType:AMOTimeLineDataTypeCloud];

从指定时间开始播放(回放,单位ms)

/// 播放(播放指定时间段 AMOPlayType =  AMOPlayerTypeTimeLine 使用)
/// @param startTime 指定开始时间
/// @param endTime 指定结束时间  -1 为直播
/// @param playType 1.未初始化播放器例如调用(start或start:) 2.已初始化播放器
- (void)start:(NSTimeInterval)startTime endTime:(NSTimeInterval)endTime playType:(NSInteger)playType;

///示例
[self.player start:[self.startDate timeIntervalSince1970] * 1000 endTime:[self.endDate timeIntervalSince1970] * 1000 playType:2];

  • 实时预览
/// 获取缩略图(主线程调用)
/// @param deviceId  deviceid
/// @param section  AMOTimeLineSection
/// @param timeStamp Section中指定时间戳
/// @param size CGSizeMake(width,height)
/// @param completion 回调
- (void)getThumbnail:(nonnull NSString *)deviceId
             section:(nonnull AMOTimeLineSection *)section
           timeStamp:(nonnull NSString *)timeStamp
                size:(CGSize)size
          completion:(AMOPlayerThumbnailHandler)completion;

///示例 AMOPlayer
    [self.player getThumbnail:self.cameraInfo.deviceId section:section timeStamp:[NSString stringWithFormat:@"%lu",(unsigned long)[startTimeDate timeIntervalSince1970] * 1000] size:CGSizeMake(1334, 750) completion:^(BOOL isSucceeded, UIImage * _Nullable image, NSString * _Nullable imgUrl, NSError * _Nullable error) {
   
    }];
  • 视频截图

截图需要在视频播放起来后进行

/// 获取缩略图
/// @param block 回调
- (void)getScreenShot:(void(^)(UIImage * _Nonnull image))block;

[self.player getScreenShot:^(UIImage * _Nonnull image) {

}

事件告警

  • 获取告警视频列表
//// 获取告警事件列表
/// @param deviceId 设备id Y
/// @param startTime 过滤开始时间,单位毫秒 13位时间戳  N
/// @param endTime 过滤结束时间 ,单位毫秒 13位时间戳  N
/// @param isPage 是否分页 (YES 只会返回一页数据 最大100条  要进行分页操作使用最后一条数据的开始时间作为下次分页的endTime;NO 全返回)
/// @param cancelTask 是否取消请求 (只支持isPage为NO 不分页场景)
/// @param shareId 分享设备传入
/// @param generate 是否生成缩略图 默认生成  generate 1 不生成缩略图  0 生成缩略图
/// @param completion 回调 Y response<NSArray<AMOTimeLineEvent>>
- (void)getEventList:(nonnull NSString *)deviceId
           startTime:(nullable NSNumber *)startTime
             endTime:(nullable NSNumber *)endTime
              isPage:(BOOL)isPage
          cancelTask:(BOOL)cancelTask
             shareId:(nullable NSString *)shareId
            generate:(nullable NSNumber *)generate
          completion:(AndMuHttpInterFaceCompletionHandler)completion;

//示例
[[AMOSDKManager sharedInstance] getEventList:self.kCameraInfo.deviceId 
								   startTime:@(startTime) 
									 endTime:@(endTime) 
									  isPage:YES 
								  cancelTask:NO 
									 shareId:self.kCameraInfo.shareId ? self.kCameraInfo.shareId : nil 
									generate:nil 
								  completion:^(BOOL isSucceeded, id  _Nullable response, NSError * _Nullable error) {
        if (isSucceeded) {
            NSArray * dataArray = response;
            [weakSelf.eventArray addObjectsFromArray:dataArray];
            dispatch_async(dispatch_get_main_queue(), ^{
                [weakSelf.playerCollectionView reloadData];
            });
        }else{
            NSLog(@"demo 获取告警信息失败 失败原因 = %@",error.localizedDescription);
        }
    }];
  • 删除告警
/// 删除告警(删除timelineEvent)
/// @param deviceId 设备id
/// @param event 要删除的evnet模型
/// @param completion 回调
- (void)deleteEvent:(nonnull NSString *)deviceId
              event:(nonnull AMOTimeLineEvent *)event
         completion:(AndMuHttpInterFaceCompletionHandler)completion;

//示例

[[AMOSDKManager sharedInstance] deleteEvent:self.cameraInfo.deviceId 
									  event:eventInfo completion:^(BOOL isSucceeded, id  _Nullable response, NSError * _Nullable error) {
        if (isSucceeded) {
            [weakSelf initData];
            [weakSelf showTipText:@"删除告警成功"];
        }else{
            [weakSelf showTipText:@"删除告警失败"];
        }
}];

AMOTimeLineEvent说明如下:

@interface AMOTimeLineEvent : NSObject
//视频id
@property (nonatomic, copy) NSString *videoId;
//开始时间
@property (nonatomic, strong) NSDate *startTime;
//结束时间
@property (nonatomic, strong) NSDate *endTime;
//播放地址
@property (nonatomic, copy) NSString *playAddress;
//事件id
@property (nonatomic, copy) NSString *eventId;
//缩略图
@property (nonatomic, copy) NSString *thumbnail; //640x360
//是否有套餐
@property (nonatomic, assign) BOOL isServerEvent;
//事件类型
@property (nonatomic, assign) AMOEventType alarmType;
//人脸id
@property (nonatomic, copy) NSString *personID;

@end

告警事件类型说明

typedef NS_ENUM(NSUInteger, AMOEventType) {
    AMOEventTypeMotion = 1,    //运动
    AMOEventTypeSound = 2,    //声音
    AMOEventTypeFace = 3,     //人脸
    AMOEventTypePeopleDetection = 4,     //人型检测
    
    //识别到某个人而没有录制的时间
    AMOEventTypePrivateFR = 6,
    AMOEventTypeManuelTurnOff = 7,
    AMOEventTypeScheduleTurnOff = 8,
    AMOEventTypeScheduleTrunOffList = 9,
    
    //门铃
    AMOEventTypeTamper = 11,
    AMOEventTypeBatteryMode = 12, //强制拆迁的警告
    AMOEventTypePIR = 13,   //有人经过
    AMOEventTypeNormalSound = 14, //盘旋报警
    AMOEventTypeModeLive = 15, //直播,没有发生门铃事件
    AMOEventTypeModeCall = 16, //门铃事件
    AMOEventTypeManualRecord = 17, //门铃拒接
    AMOEventTypeManualDoorbellHasBeenRead = 18, //门铃已接听
    AMOEventTypeDoorbellUnread = 19, //门铃未接听
    
    AMOEventTypeHamper = 20,
    AMOEventTypeCheckIn = 21,
    AMOEventTypePirMode = 22,
    
    AMOEventTypeEventStart = 36,
    AMOEventTypeEventEnd = 37,
    
    AMOEventTypeEventWander = 55, //有人逗留
    AMOEventTypeForceDestroy = 56, //暴力强拆
    
    AMOEventTypeVideoOcclusion = 70, //视频遮挡
    AMOEventTypeVideoBorderIntrusion, //边界入侵
    AMOEventTypeVideoCrossBorderDetection, //越界侦测
    AMOEventTypeVideoRegionalInvasion, //区域入侵
    AMOEventTypeVideoCustomAlarm, //自定义告警
    AMOEventTypeEquipmentMessageReporting, //设备消息上报
    AMOEventTypePassengerFlowStatistics, //客流统计
    
    AMOEventTypeShutterOpen = 100,
    AMOEventTypeShutterClose = 101,
    AMOEventTypePowerMode = 102,
    AMOEventTypeBatteryQuantity = 103,
    
    //被删除掉的时间短
    AMOEventTypeSelfDelete = 120, //被删除的时间段
    //Camera在升级的时候停止录制的时间段
    AMOEventTypeUpgrading = 121,
    
    AMOEventTypePIRMotion = 131,
    
    AMOEventTypeGBMotion = 1502,
    
    AMOEventTypeAndLinkEvent = 2000,
    AMOEventTypeModePir = 2001, //体检测触发摄像机录制事件
    AMOEventTypeDoorWindow = 2002,  //门磁打开触发摄像机录制事件
    AMOEventTypeOtherSensor = 2003, //其他传感器触发的摄像机录制事件
    AMOEventTypeCommon = 2004,
    
};

告警播放始化与释放阶段与直播类似,播放代码如下:

AMOPlayerConfig *playerConfig = [[AMOPlayerConfig alloc]init];
playerConfig.isRnnoise = true;
playerConfig.playType = AMOPlayerTypeNormal;

AMOCameraInfo *cameaInfo = [[AMOCameraInfo alloc]init];
cameaInfo.deviceId = deviceId;

AMOPlayer *player = [[AMOPlayer alloc]initWithDeviceId:cameaInfo.deviceId config:playerConfig];
player.delegate = self;

[player setEventInfo:eventInfo];

[self.player prepare];
[self.player start];

设备设置

  • 获取设备能力集设置信息
#pragma mark -- 能力集 && 设置项
/// 获取设备能力集
/// @param deviceId 设备Id Y
/// @param completion 回调  response<AMOCameraAbility>
- (void)getDeviceAbility:(nonnull NSString *)deviceId
              completion:(AndMuHttpInterFaceCompletionHandler)completion

在完成对摄像头操作后需要断开会话

具体配置项说明如下:

///设置项参数
typedef NS_ENUM(NSInteger, AMOSettingType) {
    AMOSettingTypeTitle = 1,  //设备名称
    AMOSettingTypeStatus,    //设备打开、关闭状态
    AMOSettingTypeAntiFlicker,   //防闪烁
    AMOSettingTypeNightVision,    //夜视开关
    AMOSettingTypeHDVideo,        //高清视频
    AMOSettingTypeRotateImage,     //是否旋转图片
    AMOSettingTypeCameraSound,    //设备声音采集
    AMOSettingTypeStatusLight,    //设备状态指示灯
    
    AMOSettingTypeMotionTrack, //运动追踪
    AMOSettingTypeMotionTrackBackTime, // 运动追踪归为时长设置
    
    AMOSettingTypeSoundTrack, //声音追踪(听声辨位)
    AMOSettingTypeSoundIDlocVolume,  //听声辩位声音分贝阈值
    AMOSettingTypeSoundIdLocBackTime,  //听声辩位声音分贝阈值
    
    AMOSettingTypePhoneNumber, //  App修改被呼叫的电话号码
    AMOSettingTypeOfflineSpeechRecongize, // 本地语言识别开关
    AMOSettingTypeCallSwitch, // 打电话开关
    AMOSettingTypeVideoRecordTime,  //视频收藏录像时长设置
    AMOSettingTypeBootSound, //开机欢迎声
    AMOSettingTypeScreenshotWatermark,  //手动截图水印
    AMOSettingTypeFisheyeInstallPos,  //鱼眼顶装/壁装
    AMOSettingTypeImsNumber, // 合家固话
    AMOSettingTypeTelephoneService, // 固话业务开关
    AMOSettingTypeFullColorNightVision, //全彩夜视
    AMOSettingTypeFullColorNightVisionModel, //全彩夜视模式
    AMOSettingTypeLightIntensity, //白光灯亮度
    AMOSettingTypeRegionInvasion, //区域入侵
    
    
    //告警
    AMOSettingTypeSoundDetection, //声音告警开关
    AMOSettingTypeSoundSensitivity, //声音告警灵敏度
    AMOSettingTypeMotionDetection, //运动告警开关
    AMOSettingTypeMotionSensitivity, //运动告警灵敏度
    AMOSettingTypeMotionRegions, //运动区域设置
    AMOSettingTypeFaceDetection,  //人脸识别开关
    AMOSettingTypePeopleDetection, //人形检测
    AMOSettingTypePIRDetection, // PIR检测推送开关
    AMOSettingTypePIRSensitivity, // PIR灵敏度条件
    AMOSettingTypePIRStatus, // PIR灵敏度开关
    AMOSettingTypeSoundLightAlarm, //声光报警开关
    AMOSettingTypeSoundLightAlarmVolume, //声光报警音量
    AMOSettingTypeSoundLightAlarmModel, //声光报警模式
    
    
    //告警通知
    AMOSettingTypeSendSoundAlerts, //声音通知
    AMOSettingTypeSendMotionAlerts, //运动通知
    AMOSettingTypePeopleDetectionNotify, //人形检测通知
    AMOSettingTypeSendOfflineAlerts, //离线告警通知
    
    //定时截图
    AMOSettingTypeScheduleImage, //定时截图
    AMOSettingTypeImageTimingLevel, //定时截图当前设置的频率{1,2,3,4}
    AMOSettingTypeImageTimingLevels, //定时截图开关schedule{1 = 30, 2 = 60, 3 = 120, 4 = 240}
    AMOSettingTypeImageTimingSchedule, //定时截图计划开关
    
    //门铃
    AMOSettingTypeBellRing, //响铃开关
    AMOSettingTypeLowPowerMode, //低电量模式
    AMOSettingTypeLowPowerPirDetectInterval, //低电量Pir检测间隔
    AMOSettingTypeLowPowerRecordDuration, //低电量录制时长
    AMOSettingTypeForceDestroyAlert, //强拆告警
    AMOSettingTypeWideDynamic,   //宽动态
    AMOSettingTypeSubStatusLight,  //室外门铃按钮提示灯
    AMOSettingTypeDoorbellStatus,  //门铃在线状态
    视频截图
    //抓拍机
    AMOSettingTypeFocalLength, //设置焦距( 人脸抓拍机)
    AMOSettingTypeFocusLevel, //设置对焦( 人脸抓拍机)
    AMOSettingTypeFaceExposure, //设置人脸曝光值( 人脸抓拍机)
    AMOSettingTypeFaceDetectRegion,  //设置人脸检测区域
    
    //运动检测
    AMOSettingTypePersonStatus, //客流统计开关状态
    AMOSettingTypePersonSchedules, //客流统计打开的schedule
    AMOSettingTypePersonRegion, //客流统计检测区域
    
    
    AMOSettingTypeSdCard, // sd卡录像功能
    
    AMOSettingTypeScheduleTurnOff,   //定时开关
    AMOSettingTypeNewScheduleTurnOff,   //平台定时开关
    AMOSettingTypeScheduleNotSendAlerts,   //告警定时关闭通知计划
    
    AMOSettingTypeDeviceLatitude,   //设备位置维度
    AMOSettingTypeDeviceLongitude,  //设备位置经度
    AMOSettingTypeDeviceLocation,   //设备位置
};

文件相关

获取云存储大小

#pragma mark -- 云存储
/// 获取云存储大小
/// @param deviceId 设备id
/// @param completion 回调
- (void)getCloudStorageInfo:(nonnull NSString *)deviceId
                  completion:(AndMuHttpInterFaceCompletionHandler)completion;

云台控制

#pragma mark -- 云台
/// 设置PTZ接口(主线程执行)
/// @param deviceId 设备ID
/// @param ptzType 设置PTZ类型,@see AMOPTZType
/// @param direction
/// 如果 PTZType == AMOPTZTypeTurnOnce || AMOPTZTypeTurnContinuos 需要指定此参数,上下左右
/// 如果 PTZType == AMOPTZTypeStopTurn || AMOPTZTypeResetPosition 需要指定 AMOPTZDirectReset
/// 如果 PTZType == AMOPTZTypeSetPosition 需要指定 AMOPTZDirectUnKnow
/// @param location pan 水平 tilt 上下
/// 如果(PTZType == AMOPTZTypeSetPosition)时,需要指定此参数,其它传nil。参数类型如@{@"pan": @(0), @"tilt" :@(-10203)}
/// @param completion 回调  response<NSDictiory> 成功 000000 data@{}
- (void)setPTZPosition:(nonnull NSString *)deviceId
               ptzType:(AMOPTZType)ptzType
             direction:(AMOPTZDirect)direction
              location:(nullable NSDictionary *)location
            completion:(AndMuHttpInterFaceCompletionHandler)completion;

AMPTZType && AMPTZDirect类型列举:

///Ptz
///设置PTZ类型枚举
typedef NS_ENUM(NSInteger, AMOPTZType) {
    AMOPTZTypeUnKnow          = -1,
    AMOPTZTypeTurnOnce        = 0,  //设置 一次PTZ,需要direction,上下左右
    AMOPTZTypeTurnContinuos   = 1,  //设置 持续PTZ,需要direction,上下左右
    AMOPTZTypeStopTurn        = 2,  //设置 停止持续PTZ direction = AMOPTZDirectReset
    AMOPTZTypeResetPosition   = 3,  //设置 重置PTZ direction = AMOPTZDirectReset
    AMOPTZTypeSetPosition     = 4   //设置 指定PTZ,需要location
};

///指定PTZ(摄像头摇头)的方向
typedef NS_ENUM(NSInteger, AMOPTZDirect) {
    AMOPTZDirectUnKnow = -1,
    AMOPTZDirectReset  = 0,    //重置ptz\停止摇头
    AMOPTZDirectLeft   = 1,    //AMOPTZDirectLeft: 左
    AMOPTZDirectRight  = 2,    //AMOPTZDirectRight: 右
    AMOPTZDirectUp     = 3,    //AMOPTZDirectUp: 上
    AMOPTZDirectDown   = 4,    //AMOPTZDirectDown: 下
};

SD卡

  • 获取SD卡信息
/// 获取sd卡信息
/// @param deviceId 设备id
/// @param completion 回调<AMOSDCardInfo>
- (void)getSDCardInfo:(nonnull NSString *)deviceId
           completion:(AndMuHttpInterFaceCompletionHandler)completion;


//示例
[AMOSDKManager sharedInstance] getSDCardInfo:self.cameraInfo.deviceId completion:^(BOOL isSucceeded, id  _Nullable response, NSError * _Nullable error) {
        <#code#>
    }

AMOSDCardInfo说明如下:

@interface AMOSDCardInfo : NSObject
//TF卡状态:0 不存在,1正常,2 异常,3 容量满,4 未知
@property (nonatomic, assign) NSInteger state;
//总容量
@property (nonatomic, assign) long totalSize;
//可用容量
@property (nonatomic, assign) long freeSize;
@end
  • 格式化SD卡
/// 格式化sd卡
/// @param deviceId 设备Id
/// @param timeout 超时时间 不传默认20 (最大时间55)
/// @param completion 回调 (error code = 80001 服务器格式化超时)
- (void)formatSDCard:(nonnull NSString *)deviceId
             timeout:(nullable NSNumber *)timeout
          completion:(AndMuHttpInterFaceCompletionHandler)completion;

设备状态监听

  • 注册通知
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(cameraConnectionDidChanged:) name:AMOCameraConnectionDidMessageNotification object:nil];

- (void)cameraConnectionDidChanged:(NSNotification *)note{
    __weak typeof(self)weakSelf = self;
    if ([note.userInfo isKindOfClass:[NSDictionary class]]) {
        NSDictionary *noteDic = note.userInfo;
        if ([noteDic[@"msgType"] isEqualToString:@"MESSAGE_DEVICE_BIND"]) {
            dispatch_async(dispatch_get_main_queue(), ^{
                [weakSelf showTipText:@"设备绑定消息"];
            });
        }else if ([noteDic[@"msgType"] isEqualToString:@"MESSAGE_DEVICE_UNBIND"]) {
            dispatch_async(dispatch_get_main_queue(), ^{
                [weakSelf showTipText:@"设备解绑消息"];
            });
        }else if ([noteDic[@"msgType"] isEqualToString:@"MESSAGE_DEVICE_ONLINE"]) {
            dispatch_async(dispatch_get_main_queue(), ^{
                [weakSelf showTipText:[NSString stringWithFormat:@"设备上线消息 deviceID = %@",noteDic[@"deviceId"]]];
            });
        }else if ([noteDic[@"msgType"] isEqualToString:@"MESSAGE_DEVICE_OFFLINE"]) {
            dispatch_async(dispatch_get_main_queue(), ^{
                [weakSelf showTipText:[NSString stringWithFormat:@"设备下线消息 deviceID = %@",noteDic[@"deviceId"]]];
            });
        }else if ([noteDic[@"msgType"] isEqualToString:@"MESSAGE_ADD_CAMERA_FAILED"]) {
            dispatch_async(dispatch_get_main_queue(), ^{
                [weakSelf showTipText:@"设备绑定失败消息"];
            });
        }else if ([noteDic[@"msgType"] isEqualToString:@"MESSAGE_UPGRADING_CAMERA"]) {
            
        }else if ([noteDic[@"msgType"] isEqualToString:@"MESSAGE_WIFISIGNAL"]) {
            dispatch_async(dispatch_get_main_queue(), ^{
                [weakSelf showTipText:@"收到wifi消息"];
            });
        }else if ([noteDic[@"msgType"] isEqualToString:@"MESSAGE_DEVICEBATTERY"]) {
            dispatch_async(dispatch_get_main_queue(), ^{
                [weakSelf showTipText:@"收到电量强度"];
            });
        }
    }else{
        [self showTipText:@"收到信息格式错误"];
    }
}

  • 移除通知
[[NSNotificationCenter defaultCenter] removeObserver:self name:AMOCameraConnectionDidMessageNotification object:nil];```


## 重新配网

* **获取WIFI列表**

```objective-c
#pragma mark -- Wifi
/// 获取Wifi列表(一起返回)
/// @param deviceId 设备Id
/// @param completion 回调 NSArray<AMODeviceWifiInfo>
- (void)getWiFiList:(nonnull NSString *)deviceId
completion:(AndMuHttpInterFaceCompletionHandler)completion;

AMDeviceWiFiInfo说明如下:

@interface AMODeviceWifiInfo : NSObject

//路由器mac
@property (nonatomic, copy) NSString *bssid; 

//路由器SSID
@property (nonatomic, copy) NSString *ssid;

//密码,切换WIFi时候用
@property (nonatomic, copy) NSString *password;

//加密方式
@property (nonatomic, copy) NSString *encryption;

// 信号强度,0-5, 数字越大,信号越强
@property (assign) NSInteger signal;

// 是否连接
@property (assign) BOOL connected;

@end
  • 切换WIFI
/// 切换Wifi
/// @param deviceId 设备Id
/// @param wifiInfo 设置的info对象
/// @param completion 回调
- (void)changeDeviceWiFi:(nonnull NSString *)deviceId
                wifiInfo:(nonnull AMODeviceWifiInfo *)wifiInfo
               completion:(AndMuHttpInterFaceCompletionHandler)completion;

异常情况操作处理

1.当需要退回前后台情况

当退回后台场景语音通话处于工作状态,需要先关闭通话功能

//注册程序进入前台通知
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector (updateForAppEnterForeground) name: UIApplicationWillEnterForegroundNotification object:nil];
//注册程序进入后台通知
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector (updateForAppEnterBackground) name: UIApplicationDidEnterBackgroundNotification object:nil];

进入前台
[self.player resume];

//进入后台操作
[self.player pause];


释放AMOSDKManager

//释放AndMuSDK数据
[[AMOSDKManager sharedInstance]  unInit];