GWP2P SDK For iOS 开发指南

GWP2P SDK 是基于技威时代的纯C语言P2P库,使用Objective-C进行封装的一个SDK。屏蔽其内部复杂细节,对外提供较为简洁的API接口,方便第三方应用快速集成智能摄像机等设备的APP功能。
本文档说明开发步骤及主要功能的实现,SDK详细类结构及说明可以看这里或者看SDK头文件注释。
SDK更新日志

前期准备

申请AppID和AppToken

在使用GWP2P SDK前,必须先联系我们的客服人员申请AppID和AppToken,在 GWP2P SDK 不需要直接用到,但是P2P连接需要用到GWNet登录帐号返回的两个鉴权码和sessionID,而GWNet初始化需要AppID和AppToken。如果您已经在使用GWNet,则可以跳过这一步。

下载SDK

您可以在这里下载 GWP2P SDK;或者直接联系我们获取最新版本或Beta版本。

SDK集成

导入SDK

目前 GWP2P SDK 仅支持手动导入。

1.将GWP2PSDK文件夹导入工程

直接将GWP2PSDK文件夹拖入到工程目录中,里面包含了SDK的framework文件和其他第三方依赖库,注意选择复制文件而不是引用。

2.导入系统依赖库

除了在工程中导入SDK,还需要在项目target -> Build Phases -> Link Binary With Libraries 中添加以下系统库的引用。

  • libiconv.tbd
  • libbz2.1.0.tbd
  • libz.tbd
  • libstdc++.tbd
  • libstdc++.6.tbd
  • VideoToolbox.framework
如果您使用的是 Xcode 6.X 版本,则需要将上面的动态库 *.tbd 的后缀改为 *.dylib。

3.在 Xcode 项目 Build Settings -> Other Linker Flags 中,增加 -ObjC

由于SDK中使用到了分类,需要增加这个参数。关于其详细说明请看APPLE官方文档

增加-w可以忽略一些编译警告。

4.删除重复的第三方静态库

GWP2P SDK/lib是SDK依赖的其他第三方库,包含FFmpeg、openssl等,如果您项目中其他地方也用到了同样的库,选择删掉其中一个。

GWP2P SDK/lib/LSemTMFSet是声波配网的库,里面使用了Reachability、GCDAsyncSocket等常用的类,如果冲突,可以删掉相关Reachability.o、GCDAsyncSocket.o等文件再打包。具体操作可以看这里

5.关闭Bitcode

P2P SDK 中包含其他不支持Bitcode的第三方库,需要关闭Bitcode才能编译通过。
将 Xcode 项目 Build Settings -> Enable Bitcode 设置为NO;

6.查看当前使用的SDK版本。

在Finder中打开GWP2P.framework,在其文件夹里面有一个Info.plist文件,打开,其中Bundle versions string, short对应的值就是当前SDK版本号。

初始化

在您需要使用GWP2P SDK功能的类中,import相关头文件。GWP2P.h引用了 SDK 所有的头文件,您也可以按照类的功能需求选择性的引用。

#import <GWP2P/GWP2P.h>

如果您使用swift, 需要在您工程的Bridging-Header.h文件中加入SDK的引用。

#import <GWP2P/GWP2P.h>

连接P2P库

在APP使用GWNet登录并获取到两个P2P鉴权码和SessionID之后,调用 [GWP2PClient sharedClient] 连接P2P的方法。对设备发送指令、监控等操作前要连接P2P库,不需要用到技威的功能时请断开连接。连接与断开连接的代码如下:

/**
 @method
 @abstract 连接服务器
 @discussion 程序启动时首先要连接服务器,才能与设备通信。如果只需支持某一公司的设备,那么请向技威的技术支持咨询获取你们的客户ID
 @param account 技威服务器账号 不是注册时的邮箱,手机号,是登陆返回的值取后31位:[json[@"UserID"] intValue] & 0x7fffffff
 @param codeStr1 技威账号登陆成功后返回的 rCode1 为固定值
 @param codeStr2 技威账号登陆成功后返回的 rCode2 为固定值
 @param sessionID1 技威账号登陆成功后返回的 sessionId1 , 每次登陆返回值不固定
 @param sessionID2 技威账号登陆成功后返回的 sessionId2 , 每次登陆返回值不固定
 @param customerIDsArray 技威客户公司id数组,传nil表示支持所有技威的设备。数组内传了几个公司的ID,连接后就支持对应公司的设备。最多支持10个。传入的ID值不正确时,支持不了设备,都传0时与传nil效果一样。要了解具体客户ID,请联系技威客服。
 @result 返回值代表是否连接成功
 */
- (BOOL)connectWithAccount:(NSString *)account
                  codeStr1:(NSString *)codeStr1
                  codeStr2:(NSString *)codeStr2
                sessionID1:(NSString *)sessionID1
                sessionID2:(NSString *)sessionID2
               customerIDs:(NSArray <NSNumber *> *)customerIDsArray;

/**
 @abstract 断开连接
 */
- (void)disconnect;

设备设置

要对设备进行设置指令的操作,首先保证当前账号已经连接上了技威服务器。

设备的某些状态的改变可通过实现 GWP2PClientProtocol 协议中的方法进行监听,如设备报警、门铃设备通过串口透传的响铃事件、下载文件完成事件、设备更新进度、当前账号接收到串口透传信息等。

设置操作的接口在 GWP2PClient 分类中,主要包括以下几个分类,后续新功能会加在对应的分类中或新建分类.分类是按照Yoosee设备设置功能来进行划分的,如果哪条指令在分类中按照分类的字面意思不好查找时,请先打开Yoosee,在第一个界面设备列表中添加一台设备,然后点设备右下角的设置按钮,进入设置界面,SDK中的分类就是按照设置界面的功能进行分类排序的.

GWP2PClient 类中实现了一条发送二进制数据的接口,用户使用这条接口可以实现在GWP2PClient分类中没有实现的功能,一般是针对特殊客户定制的功能,分类中实现的功能请不要调用这个接口.

GWP2PClient+DeviceInfomation 设备信息

  • 设备基本信息: getMultipledeviceStatusWithDeviceID:password:completionBlock:方法获取到的设备状态包括布防状态,蜂鸣器蜂鸣时长,网络类型等多项设备状态信息(详细设备状态请参考方法注释),当设备注释里有对应的key但实际返回结果没有时,表示设备不支持该功能

  • 下载文件

    分下载普通文件与下载报警图片两个接口,普通文件下载传入的远程路径就是设备返回的文件路径,报警图片传入的远程路径要经过处理才是正确的路径,接口传入的本地路径是保存在app里的路径,路径要传对,否则生成不了文件,文件下载成功后会在 GWP2PClientProtocol 协议里的 client:didDownloadFile:withFilePath:deviceID:result: 方法中返回下载结果

  • 设备连网操作

    获取设备搜索到的Wifi列表,切换设备网络连接类型,设置设备连接某个wifi,注:设备只支持2.4G频段wifi

  • 设备时间时区

    时区在设备基本信息中获取

  • 设备安全设置

    设置设备初始密码、管理员密码与访客密码

  • 设备更新
    设置自动更新状态,检查设备是否可更新,执行设备更新,取消设备更新

  • 获取用户及设备在线状态等信息

GWP2PClient+Alarm 设备报警操作

  • 设置设备移动侦测状态及移动侦测灵敏度

  • 设置设备蜂鸣器状态

  • 设置设备人体红外开关状态

  • 设置设备有线报警输入开关状态

  • 设置设备有线报警输出开关状态

  • 获取设备报警时推送的绑定账号

  • 设置设备报警时推送的绑定账号

    一次传入多个报警账号,设置后,覆盖原来所有的账号

  • 获取设备报警邮箱:

    获取后的邮箱密码等数据可能不准确,可参考的是邮箱是否验证成功,SMTP邮箱密码是否正确

  • 设备报警时,关闭蜂鸣器

  • 设备报警时解除关联的当前报警账号

GWP2PClient+APMode AP模式的操作

  • 从连网模式切换至AP模式

  • 获取设备是否连接过wifi

    若设备不支持,只会超时,此bug待日后更新

  • AP模式下设置设备wifi

    设置后设备切回连网模式并连接设置的wifi. 若设备不支持,只会超时,此bug待日后更新

  • AP模式下设置设备wifi密码

GWP2PClient+Defense 设备布防操作

  • 获取设备定时布撤防数据

  • 设置设备定时布撤防

    一次设置所有定时布撤防

  • 操作设备预置位

GWP2PClient+PictureAndSound 画面与声音

  • 设置设备视频制式

  • 设置设备音量

  • 设置图像倒转状态

  • 获取设备指示灯状态

  • 设置设备指示灯状态

GWP2PClient+Record 录像设置

  • 获取设备SD卡信息

  • 设备录像类型及录像质量操作

  • 设置设备预录像开关状态

  • 设置设备报警后的录像时间

  • 设置设备计划录像时间

  • 设置手动录像开关状态:没有SD卡时,设置无效

  • 格式化设备SD卡

  • 获取设备回放文件

    一次只能获取60个文件,如果给定的时间差大于60个文件,会分多次获取,一次返回多次获取文件,为保证每次数据都能正常返回,若无特殊要求,两次给定的时间差尽量小

GWP2PClient+SceneMode 情景模式操作

只有情景模式设备才支持

  • 获取设备所有情景模式

  • 设置设备一个情景模式

  • 删除设备一个情景模式

GWP2PClient+Sensor 传感器操作

设备传感器操作

情景模式的传感器与其它设备的传感器操作不一样,对两种设备的传感器操作时要调用不同的API.

普通设备传感器

连接传感器,先调 operateASensor: withOperationType:deviceID:devicePassword:completionBlock:方法,给设备发增加传感器指令,使设备处于待连接的状态,再操作传感器,使传感器发出信号,设备收到传感器信号后,就会连接这个传感器,连接成功或失败后都会有回调.普通设备可通过如下指令操作传感器:

  • 获取设备已连接的传感器(普通传感器、特殊传感器)及遥控器

  • 获取已连接传感器的开关状态(遥控器不支持)

  • 获取传感器绑定的预置位(遥控器不支持)

  • 传感器绑定预置位(遥控器不支持)

  • 获取传感器的名字

    一次获取所有已连接传感器的名字,老版本设备不支持

  • 设置传感器的名字

    一次只能设置一个传感器的名字

  • 增加、删除一个传感器或遥控器

  • 设置一个传感器(不包括遥控器)的开关状态

情景模式设备传感器

各种传感器类型及功能情况如下表

传感器名称 type subType 有无开关 有无情景模式 有无传感器唯一标识 是否支持名字 所属传感器类型
移动侦测 1 0 特殊传感器
防攻击 1 1 特殊传感器
遥控器 0 0 遥控器
门磁 0 1 普通传感器
烟雾传感器 0 2 普通传感器
瓦斯探测传感器 0 3 普通传感器
电灯 0 4 普通传感器
窗帘 0 5 普通传感器
插座 0 6 普通传感器
人体红外 0 7 普通传感器
水浸 0 8 普通传感器
急救 0 9 普通传感器
警号 0 10 普通传感器
空调传感器 0 11 普通传感器
情景模式设备传感器接口

连接传感器,先调 ceneModeDeviceConnectASensorOrRemoteControlWithDeviceID:devicePassword:completionBlock: 方法,给设备发增加传感器指令,使设备处于待连接的状态,再操作传感器,使传感器发出信号,设备收到传感器信号后,就会连接这个传感器,连接成功或失败后都会有回调.情景模式设备可通过如下指令操作传感器:

  • 获取所有传感器信息(包括遥控器、普通传感器、特殊传感器)
  • 操作一个插座类型的传感器的开关状态
  • 设置遥控器名字
  • 设置传感器名字
  • 删除一个遥控器
  • 删除一个传感器
  • 连接一个传感器或遥控器
  • 通过二维码扫描连接一个传感器或遥控器
  • 设置特殊传感器
  • 设置普通传感器情景模式
  • 设置普通传感器预置位

门铃开锁

发送串口透传数据

监控/视频通话/回放

视频播放有三种类型:监控、视频通话和SD卡的录像回放,这三种类型的传输原理和接口是一样的,只是支持的音视频输入输出不一样。详见下表:

类型 视频输入 音频输入 视频输出 音频输出
监控 支持 支持 不支持 支持
通话 支持 支持 支持 支持
回放 支持 支持 不支持 不支持

在GWP2P SDK中,封装了一个播放器GWP2PPlayer对三种视频进行播放,这是基类,包含视频播放的基本控制及通用功能,如静音、截图等;其GWP2PPlayer+Fisheye分类,包含鱼眼画面的形状变化及旋转功能。GWP2PVideoPlayer和GWP2PPlaybackPlayer都继承自GWP2PPlayer,前者用于监控和通话,后者用于回放。

监控与视频通话

对于APP客户端来说,通话只是比监控多了向设备传输视频流及设备主动呼叫一项,其他功能和操作是一致的,所以放在一块,目前仅有NPC类型的设备支持视频通话。

进行监控和通话很简单,首先创建GWP2PVideoPlayer,将其view做为子view添加到控制器view或者其他view中,然后呼叫设备,即可进行视频监控和通话。

创建Player并添加View

- (void)viewDidLoad {
    [super viewDidLoad];
    GWP2PVideoPlayer *player = [[GWP2PVideoPlayer alloc] init];
    self.player = player;
    self.player.delegate = self;
    [self.view addSubview:self.player.view];
}

- (void)viewDidLayoutSubviews {
    [super viewDidLayoutSubviews];
    self.player.view.frame = self.view.bounds;
}
  • 虽然没有使用单例的形式,但请不要同时创建多个Player,否则会出现异常。

呼叫设备

使用呼叫设备的方法进行呼叫设备,呼叫状态通过block进行返回并携带一些参数,视频会自动在准备就绪后开始显示在上一个步骤添加的View中。通常情况下,正在呼叫和设备接受返回的参数不需要关注和处理。

[self.player p2pCallDeviceWithDeviceId:@"yourDeviceID" password:@"yourDevicePassword" deviceType:GWP2PDeviceTypeIPC deviceSubtype:GWP2PDeviceIPCSubtypeNormal calling:^(NSDictionary *parameters) {
    NSLog(@"[正在呼叫],paras=%@",parameters);
} accept:^(NSDictionary *parameters) {
    NSLog(@"[设备接受],paras=%@",parameters);
} reject:^(GWP2PCallError error, NSString *errorCode) {
    NSLog(@"[设备拒绝/挂断],error=%ld,errorCode=%@",(unsigned long)error, errorCode);
} ready:^{
        NSLog(@"[准备就绪]");
}];
  • call成功后会开启麦克风,请确保已经在项目中的Info.plist增加请求麦克风权限描述配置项Microphone Usage Description,否则APP会出现崩溃。

接受设备的呼叫

通过通知kGWP2PDeviceIsCallingNotification监听设备的呼叫;如果有NPC设备正在呼叫当前用户,创建Player并调用接受呼叫方法来与呼叫设备建立连接。

//监听设备主动呼叫的通知
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(deviceIsCallingNotification:) name:kGWP2PDeviceIsCallingNotification object:nil];
/**
 接受当前的设备呼叫请求

 @param acceptBlock 接收呼叫回调,详见block定义注释
 @param rejectBlock 拒绝连接回调,详见block定义注释
 @param readyBlock  连接就绪回调,详见block定义注释
 */
- (void)p2pAcceptCallingWithaccept:(P2PAcceptBlock)acceptBlock
                            reject:(P2PRejectBlock)rejectBlock

                             ready:(P2PReadyBlock)readyBlock;
  • 如果用户正在监控其他设备,NPC设备是无法呼叫进来的。

对讲

开启/关闭向设备传输麦克风音频流。默认关闭。

/**
 讲话开关。开启时向设备发送麦克风音频,默认关闭。
 
 @param enable YES:开启,NO:关闭
 */
- (void)p2pEnableSpeak:(BOOL)enable {
    [[PAIOUnit sharedUnit] setSpeckState:enable];
}

摇头机镜头转动控制

发送控制命令给摇头机,由于设计原因,设备端收到指令后会有相应的动作,但是并不会回复某条指令的结果,所以无法在UI层呈现操作结果。

/**
 控制摇头机镜头转向

 @param direction 转动方向枚举
 */
- (void)p2pTurnDirection:(GWP2PPTZDirection)direction;

设置视频清晰度

/**
 设置视频清晰度

 @param definition 清晰度枚举
 */
- (void)p2pSetDefinition:(GWP2PPTZDefinition)definition; 

协议 GWP2PVideoPlayerProtocol <GWP2PPlayerProtocol>

正在监控或者视频通话时,一些设备的状态会通过代理进行回调,如观看人数变化、布撤防状态改变、SD卡录像状态等。

/**
 设备(目前仅指NPC)正在主动呼叫当前登录用户,与上面的通知选择一种方式监听即可
 
 @param deviceId       设备ID
 @param isInSameDomain 对方与本机是否在同一个局域网
 */
- (void)p2pVideoPlayer:(GWP2PVideoPlayer *)player deviceIsCallingWithDeviceId:(NSString *)deviceId isInSameDomain:(BOOL)isInSameDomain;

/**
 观看人数变化回调
 触发场景:
 1.呼叫设备后开始监控时
 2.观看人数变化时(其他监控者加入或者断开)
 3.高清-标清,高清-流畅,两种情况的分辨率互相切换时(标清-流畅切换不触发)
 
 @param currentNumber 当前观看人数
 */
- (void)p2pVideoPlayer:(GWP2PVideoPlayer *)player numberOfAudiencesChange:(NSUInteger)currentNumber;

/**
 远程录像(SD卡录像)状态发送改变

 @param parameters 参数 @"isRemoteRecording":@(BOOL),是否正在录像
                       @"hasSDCard":@(BOOL),是否有SD卡
                       @"isRecordFalse":@(BOOL),是否录制失败,可能SD卡损坏
 */
- (void)p2pVideoPlayer:(GWP2PVideoPlayer *)player remoteSDCardRecordStateChange:(NSDictionary *)parameters;

/**
 布防状态发生改变

 @param isDefenceOn 改变后的布防状态. YES:布防状态,NO:撤防状态
 */
- (void)p2pVideoPlayer:(GWP2PVideoPlayer *)player defenceStateChange:(BOOL)isDefenceOn;

回放

回放的操作和上述监控与视频通话的操作是一样的,不同之处在于呼叫方法的操作有所区别,回放时增加一个回放文件的对象参数playbackFile,可通过GWP2PClient+Record中的获取回放文件列表方法获取某个设备的回放文件对象列表。

/**
 播放设备远程录像文件,原理和监控设备是一样的,需要先呼叫连接设备
 
 @param deviceId      设备ID
 @param password      设备密码
 @param deviceType    设备类型
 @param deviceSubtype 设备子类型
 @param playbackFile  回放文件对象,由GWP2PClient+Record中的获取回放文件列表方法获取
 @param callingBlock  正在呼叫回调,详见block定义注释
 @param acceptBlock   接收呼叫回调,详见block定义注释
 @param rejectBlock   拒绝连接回调,详见block定义注释
 @param readyBlock    连接就绪回调,详见block定义注释
 */
- (void)p2pCallPlaybackFileWithDeviceId:(NSString *)deviceId
                               password:(NSString *)password
                             deviceType:(GWP2PDeviceType)deviceType
                          deviceSubtype:(GWP2PDeviceIPCSubtype)deviceSubtype
                           playbackFile:(GWPlaybackFileModel *)playbackFile
                                calling:(P2PCallingBlock)callingBlock
                                 accept:(P2PAcceptBlock)acceptBlock
                                 reject:(P2PRejectBlock)rejectBlock
                                  ready:(P2PReadyBlock)readyBlock;
  • 快速切换录像文件

正在回放时,调用以下方法快速切换回放文件,无需重新调用call的方法。播放上一个下一个文件功能通过此方法实现。

/**
 播放远程录像文件,如果已经连接上设备,调用此方法即可快速切换回放文件

 @param playbackFile 回放文件对象
 */
- (void)p2pPlayPlaybackFile:(GWPlaybackFileModel *)playbackFile;
  • 暂停
/**
 暂停或者继续播放
 */
- (void)p2pPauseOrResume;
  • 快进
/**
 快进或者取消快进
 */
- (void)p2pFastForwardOrCancel;
  • 指定时间播放
/**
 指定播放时间

 @param seekTime 播放时间(单位是微秒,如要跳到第45秒,传入45*1000*1000)
 */
- (void)p2pSeekToTime:(uint64_t)seekTime;
  • 属性

通过属性监听当前文件的总时长、当前时间点、当前播放状态等。

/** 当前播放的文件 */
@property (nonatomic, readonly) GWPlaybackFileModel *playbackFile;

/** 当前播放的时间,单位:微秒μs,可监听此时间变化更新播放进度条*/
@property (nonatomic, readonly) uint64_t currentTime;

/** 当前文件总时长,单位:微秒μs,开始播放时设备端会返回这个时间,正常情况下与playbackFile中的time是一样的,建议使用这个totalTime*/
@property (nonatomic, readonly) uint64_t totalTime;

/** 回放的状态 */
@property (nonatomic, readonly) GWP2PPlaybackState playbackState;

通用功能

GWPlayer和GWPlayer+Fisheye作为基类,监控/视频通话/回放都能使用其属性和方法。

  • 属性说明
属性 说明
view与scrollView view-scrollView-openGLView,GWPlayer的view有这三层结构;
scrollView用于实现电子放大,可调整放大倍数、开启或者关闭功能等;
openGLView用于渲染图像。
isPlaying 只读,是否正在播放
mute 静音开关。YES:停止音频输入;NO:开启音频输入
enableGesture 手势开关。YES:开启内部手势;NO:关闭内部手势。
内部手势的触发通过代理方法p2pPlayer: recieveGestureRecognizer:回调。
  • 停止监控/视频/回放
/**
 停止监控/视频/回放
 */
- (void)p2pStop;
  • 截屏
/**
 截屏,注意timeInterval仅对鱼眼设备有效,转换成时间格式使用时区[NSTimeZone timeZoneForSecondsFromGMT:0]
 @param completionBlock 回调
 */
- (void)p2pScreenshot:(void (^)(UIImage *screenshot, NSTimeInterval timeInterval))completionBlock;
  • 鱼眼操作

GWPlayer+Fisheye分类包含鱼眼设备图像相关的操作。

@interface GWP2PPlayer (Fisheye)

/** 鱼眼显示形状,可直接修改 */
@property (nonatomic, assign) GWP2PFisheyeShapeType shapeType;


/**
 放大,对应缩放手势
 */
- (void)fisheyeZoomIn;

/**
 缩小,对应缩放手势
 */
- (void)fisheyeZoomOut;

/**
 指定位置放大,对应长按手势

 @param location 在View中的位置
 */
- (void)fisheyeZoomInWithLocation:(CGPoint)location;

/**
 指定位置缩小,对应双击手势

 @param location 在View中的位置
 */
- (void)fisheyeZoomOutWithLocation:(CGPoint)location;

/**
 移动鱼眼画面,对应拖拽手势,手势状态changed时调用,传入当前手势位置坐标及上次手势位置坐标

 @param lastLocation    上次手势位置坐标
 @param currentLocation 当前手势位置坐标
 */
- (void)fisheyeMoveFrom:(CGPoint)lastLocation to:(CGPoint)currentLocation;

/**
 设置惯性移动,在拖拽手势结束时调用;调用fisheyeEnableDrift:NO后无效

 @param vector 矢量坐标,如:x=手势当前位置x-手势上次响应的x,y=手势当前位置y-手势上此响应的y;
 */
- (void)fisheyeFlingWithVector:(CGPoint)vector;

/**
 如果画面正在自动旋转,则停止;对应单击手势
 */
- (void)fisheyeStopDrift;

/**
 开启/关闭漂移,默认开启,开启时拖拽手势有惯性并在手势结束后自动旋转

 @param enaleDrift 开启/关闭
 */
- (void)fisheyeEnableDrift:(BOOL)enaleDrift;

/**
 设置漂移速度,默认30

 @param speed 速度,默认30
 */
- (void)fisheyeSetDriftSpeed:(CGFloat)speed;

@end

录制MP4视频到手机

在进行通话、监控或回放时,可以实时录制MP4格式的视频片段保存到手机,在SDK中,有两个类实现这个功能,GWMP4RecorderGWP2PMP4Recorder,前者是基类,实现了通用的录制MP4功能,后者继承自前者,封装了从P2P获取音视频数据的方法。所以使用时创建GWP2PMP4Recorder才可以录制监控视频,操作方法和相关定义请查看GWMP4Recorder.h
录制MP4只需简单两步(详见Demo):
1、监控中,开始录制。推荐使用懒加载创建GWP2PMP4Recorder

/**
 开始录制视频
 @param savePath 视频保存路径

 */
- (void)startRecordWithSavePath:(NSString *)savePath;

/**
 开始录制视频
 
 @param savePath 视频保存路径
 @param eventHandler 录制开始、异常等事件回调
 */
- (void)startRecordWithSavePath:(NSString *)savePath eventHandler:(MP4RecordEventHandler)eventHandler;

2、停止录制。切换分辨率会自动停止录制,建议在切换分辨率前自行停止。 退出监控、切换清晰度等操作前请先停止录制,否则视频可能会出现异常。

/**
 停止录制视频
 */
- (void)stopRecord;


/**
 停止录制视频
 这个方法可以选择是否同时将视频保存到系统相册,注意这里是复制,将占用双倍存储空间。
 @param saveAlbum 是否同时将视频保存到系统相册
 */
- (void)stopRecordAndSaveToPhotosAlbum:(BOOL)saveAlbum;

录制时事件定义:

typedef NS_ENUM(NSUInteger, MP4RecordEvent) {
    MP4RecordEventStart,                /**< 初始化成功,开始录像 */
    MP4RecordEventStop,                 /**< 停止录像 */
    MP4RecordEventEncoderInitFailed,    /**< 初始化失败 */
    MP4RecordEventRatioChanged,         /**< 切换了视频分辨率,停止录像 */
};

设备配网

设备配网,是指给设备配置网络。设备连接到互联网后,会自动接入设备固件配置的云服务器,此时就可以通过 GWP2P SDK 对设备进行操作。 设备连接网络的方式的有两种,有线和WiFi。 有线方式直接给设备插入网线即可,这里主要说明通过 P2P SDK 给设备配置WiFi网络。

目前给设备配置网络有两种方法:

  • 智能联机: 通过声波和空中发包的方式给设备发送WiFi信息。
  • AP配网:通过连接设备的AP热点,通过UDP给设备发送WiFi信息。

无论通过哪种方式,设备联网成功后都会在局域网广播固定格式的数据,通知APP联机成功。

在GWP2P SDK 中,GWP2PDeviceLinker是专门处理设备配网的类。

智能联机

直接调用智能联机的方法,即可发送WiFi信息。 需要注意的是这也是广播的形式,并不是指定对某个设备进行发送。局域网中有设备联网成功,会通过block进行回调。 需要停止智能联机时,请手动调用方法停止。

/**
 智能联机,内部会同时发送声波和空中发包
 
 @param ssid              设备需要连接的WiFi SSID
 @param password          设备需要连接的WiFi 密码
 @param deviceLinkInBlock 设备连接到网络的回调
 */
- (void)p2pSmartLinkDeviceWithWiFiSSID:(NSString *)ssid
                              password:(NSString *)password
                          deviceLinkIn:(DeviceLinkInBlock)deviceLinkInBlock;

/**
 停止智能联机,请在设备联网成功后手动调用停止
 */
- (void)p2pStopSmartLink;

AP配网

AP配网需要先重置设备,让设备进入AP配网模式,此时设备会发出名称为”GW_AP_XXXXXX”格式的热点。手机连上这个热点后,调用AP联机的方法给设备发送WiFi帐号密码和要给设备设置的管理密码。设备收到后,会通过block回调其ID和是否支持AP模式。然后设备断开AP去连接WiFi,成功后会在局域网广播其信息,在SDK中通过block回调。

/**
 AP配网。在连接到支持AP配网的设备的热点(GW_AP_XXXXXX)后,调用此方法给设备发送WiFi帐号及密码,以及要给设备初始化的管理密码
 
 @param ssid                wifi名称
 @param wifiPassword        wifi密码
 @param devicePassword      设备密码
 @param deviceReceiveBlock  设备收到WiFi信息的回调,准备断开AP热点去连接WiFi。deviceId:设备ID
 @param deviceLinkInBlock   设备连接到网络的回调
 */
- (void)p2pAPLinkDeviceWithWiFiSSID:(NSString *)ssid
                       wifiPassword:(NSString *)wifiPassword
                     devicePassword:(NSString *)devicePassword
                      deviceReceive:(DeviceReceiveBlock)deviceReceiveBlock
                       deviceLinkIn:(DeviceLinkInBlock)deviceLinkInBlock;

局域网设备

GWP2PDeviceLinker还提供搜索局域网设备的功能。在连接上P2P后,SDK内部会自动开启搜索局域网设备,30秒更新一次。通过属性lanDevices直接获取局域网设备列表。

如果需要马上刷新列表,调用以下方法:

/**
 刷新局域网设备。lanDevices每30刷新,调用此方法马上发送一次刷新指令。
 */
- (void)refreshLanDevices;
  • 确切的讲,以上30秒更新一次以及马上刷新,都是指发送局域网搜索指令。局域网设备的回应时间是不确定的,大部分情况都会在1秒内更新。

新全景SDK集成和使用

从GWP2P_1.4.0开始,集成了全新的全景库(GWPanoSDK.framework),具有丰富的显示模式和简便易用的功能接口。但是由于此全景库使用Unity3D实现,自身体积较大,也会较大的增加APP体积(ipa增加30M左右),开发者可以灵活选择是否使用新全景库。

集成完整的PanoSDK

1、下载的SDK压缩包中包含两个GWPanoSDK.framework,分别在GWP2PSDK(150k)和GWP2PDemo(700M)文件夹中,如果需要使用新全景,则需要导入GWP2PDemo中的GWPanoSDK.framework,也就是700M这个。不使用全景需要导入150K这个framework。

2、项目target配置Build Phases->Link Binary With Libraries增加以下framework:

  • CoreMedia.framewor
  • CoreMotion.framework
  • MediaPlayer.framework
  • CoreLocation.framework

3、项目target配置Build Phases->Copy Bundle Resources,点击+,找到第1步导入的GWPanoSDK.framework路径,选中framework文件夹中的Data文件夹,点击open,再选择create folder references进行确定,将Unity运行所需资源文件导入到项目。

4、项目target配置Build Settings->Other Linker Flag,增加-force_load "$(SRCROOT)/GWPanoSDK.framework/GWPanoSDK"(注意路径按实际导入路径)

5、以上配置可参考Demo,配置完成后编译项目。

使用新全景进行播放

1、使用新全景进行监控和回放,和监控/视频通话/回放一节中的使用方法一致,只是在创建播放器时需要使用新提供的构造方法,usePano传入YES即可。

//以监控为例,详见Demo中的PanoMonitorController
- (GWP2PVideoPlayer *)player {
    if (!_player) {
        _player = [[GWP2PVideoPlayer alloc] initWithUsingPano:YES];
    }
    return _player;
}
  • 所有设备均可使用全景模式,只是非全景设备会变形。每次播放自行根据设备类型判断是否启动全景。
  • 使用新全景,GWP2PPlayer+Fisheye.hGWP2PPlayer.h中的scrollViewenableGesture以及手势回调的协议方法将失效。
  • APP第一次调用此方法将开始初始化Unity,占用30M左右内存,退出监控时暂停Unity(暂无法完全销毁、回收内存)。

2、切换显示模式

#import <GWPanoSDK/GWPanoSDK.h>

[PanoPlugin setShowMode:showMode];

  • 全景支持9种显示模式,其中PanoModeWideAngle广角模式适用于180设备,其他适用于360设备。
  • 模式说明及全景其他接口,均在PanoPlugin.h中,详见代码注释。

3、新的全景播放没有显示时间戳,而是在GWP2PPlayer中增加了当前全景视频ptspanoPTS,如有需要可以自行创建UI进行显示。

/** 当前全景视频pts,转化成时间戳(秒)=pts/(1000*1000) */
@property (nonatomic, assign, readonly) uint64_t panoPTS;

NSDate *displayDate = [NSDate dateWithTimeIntervalSince1970:panoPTS/(1000 * 1000)];