- 修复设备断开连接后,未正确处理eof逻辑的问题
// 下载视频文件示例:
const file = { file_name: 'p2p_demo_file.mp4' };
const params = `channel=0&file_name=${file.file_name}&offset=0`;
// 临时文件路径
const filePath = `${wx.env.USER_DATA_PATH}/${file.file_name.replace('/', '_')}`;
// 使用FileSystemManager组装文件
const fileSystemManager = wx.getFileSystemManager();
p2pModule.startLocalDownload(ipcId, { urlParams: params }, {
onChunkReceived: (chunk) => {
// 接收chunk包并组装文件
fileSystemManager.appendFileSync(filePath, chunk, 'binary')
},
onComplete: () => {
// 流结束了,会触发onComplete回调函数
// 保存组装的临时视频文件到相册
wx.saveVideoToPhotosAlbum({
filePath,
success(res) {
// saved file handler
},
fail(res) {
// Error handler
}
});
},
onSuccess: () => {
// 下载成功了,此时拿到的数据是完整的了
},
onFailure: (result) => {
// http.status >= 400 && http.status < 600 会触发这个事件
// Error handler
},
onError: (result) => {
// 网络传输错误,虽然http.status 为 200, 但下载过程中失败了。会触发这个事件
},
});
- 修复某些情况下使用udp6返回空的
data.local.address
时导致流程报错的问题
此次变更为打断性更新,不兼容之前的版本,即1.x.x版,2.x.x版
修改 init
函数,入参和返回值均有改动,用法如下:
p2pModule
.init({
appParams: {
appid: $yourTCloudAppId,
appOauthId: $yourAppOauthId,
appKey: $yourAppKey,
appSecretKey: $yourAppSecretKey,
appPackage: $yourAppPackage,
},
initParams: {
deviceP2PVersion: p2pModule.DeviceVersion.Device_2_4 // Device_2_3: 2.3设备, Device_2_4: 2.4设备
eventHandler: (event, detail) => {
// 各种本地NAT相关的事件通知,取值见api说明,要求最低版本 1.1.1
},
}
})
.then((res) => {
console.log('init res', res);
})
.catch(({ errcode, errmsg }) => {
console.error('init error', errcode, errmsg);
});
多了initParams
对象,将原来的eventHandler
移动进来,添加deviceP2PVersion
属性,该属性必传。 注意,调用init
函数中,正确拼写字段名哦
res
对象是内部类的实例,有如下属性:deviceP2PVersion, localXp2pInfo, 方法:reset, 该方法用于重置当前版本的p2p模块
调用
init
函数报错 -2000, 仔细检查init
函数入参,一般是入参异常导致的
添加 getModule
函数,可以通过p2pModule.getModule(p2pModule.DeviceVersion.Device_2_3)
来获取上步init
后的res
对象,因此不需要将res对象保存到本地变量, 如果要重置对应版本的p2p模块,可以这样使用:
p2pModule.getModule(p2pModule.DeviceVersion.Device_2_3).reset()
.then(res => {
console.log('init res', res);
})
.catch(({ errcode, errmsg }) => {
console.error('init error', errcode, errmsg);
});
注意:
reset
方法和init
方法返回的res
值是一致的结构
移除 resetP2P
函数,该函数原用于重新初始化p2p sdk, 现在初始化p2p模块,可以通过保存init
后的res
对象来操作,也可以通过调用getModule
函数来操作
修改 getLocalXp2pInfo
函数,获取本地的peername。现在调用该函数需要传入要获取初始化好的p2p模块所对应的版本号,推荐使用getModule
来获取本地的peername
修改 startLocalDownload
方法入参,该函数用于下载录像文件,原先的调用方式startLocalDownload({ urlParams: '_crypto=off&channel=0&file_name=xxx&offset=0' })
,在2.0.4版本的插件中做了调整,将加密参数提取出来,单独作为一个参数offCrypto
来进行传递,最新的调用方式如下:
// offCrypto指明是否下载(不)加密的视频
p2pModule.startLocalDownload(ipcId, { urlParams: params, offCrypto: false })
该函数在2.0.4版本的插件中做了调整, 如果从2.0.4版本以上升级到3.0.0则不需要关注该函数,但如果是从2.0.3及以下版本直接升级到3.0.0版本,对该函数的调用需要注意参数的调整
接入3.x.x版本(兼容版本)的注意事项:
兼容版本提供了同时接入不同设备版本的能力。在这个版本中,允许同时存在多个p2p模块(我们定义init
函数返回的p2p模块)。即可以调用多次的init
函数,以初始化不同版本的p2p模块。在后续与设备的开流过程中,sdk会根据xp2pInfo信息自动选择相应的p2p模块,以进行网络传输
tips:
- 如果确定只有最新的2.4.x的设备版本,可以只初始化2.4的设备,这样可以享受到快速出图特性
- 如果是2.3.x,2.4.x的设备都有,可以使用
Promise.all
一开始就将两个版本的模块都初始化好 - 如果确定刚进入小程序就连接的是2.4.x的设备版本,后续可能会用到2.3.x的设备,可以先
init
好2.4版本模块,然后在then
方法中再init
2.3版本模块以备后用。 p2pModule.DeviceVersion
当前有如下取值,Device_2_3: 2.3设备, Device_2_4: 2.4设备