咸鱼

咸鱼是以盐腌渍后,晒干的鱼

0%

XX物联网智能视频服务(消费版)2.0 Android SDK使用总结

SDK 1.0 和 2.0 差别挺大的,目前SDK 2.3.0是最新版本

一、资源文档

1. Github开源资源

2. 官网资源

其实这部分的资料也是在Github上的,Github上的资源会比较新。

二、 SDK函数

这是SDK 2.3.0所有的接口

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
public static native void setCallback(XP2PCallback callback);
public static native int setQcloudApiCred(String id, String key);
public static native int startServiceWithXp2pInfo(String id, String product_id,
String device_name, String xp2p_info);
public static native String delegateHttpFlv(String id);
public static native int setStunServerToXp2p(String server, int port);

public static native void runSendService(String id, String cmd, boolean crypto);
public static native int stopSendService(String id, byte[] data);

public static native int dataSend(String id, byte[] data, int len);

//getCommand是废弃的接口
public static native String getCommandRequestWithSync(String id, String cmd, long timeout);
public static native void getCommandRequestWithAsync(String id, String cmd);

public static native String postCommandRequestSync(String id, byte[] command, long cmd_len, long timeout_us);
public static native int postCommandRequestWithAsync(String id, byte[] command, long cmd_len);

//向camera设备请求媒体流,异步回调方式,和 delegateHttpFlv() 的使用互斥
public static native void startAvRecvService(String id, String cmd, boolean crypto);
public static native int stopAvRecvService(String id, byte[] data);

public static native void stopService(String id);

SDK函数调用顺序:

  • setQcloudApiCred:设置密钥
  • setCallback:回调
  • startServiceWithXp2pInfo:初始化P2P连接
  • runSendService:如果没有发送需求可不调用该接口
  • dataSend:如果没有发送需求可不调用该接口
  • stopSendService:该接口暂时不用调用
  • stopService

三、P2P连接

1.通过密钥连接

  • setQcloudApiCred(“xxx”,”xxx”)
  • setCallback(this)
  • startServiceWithXp2pInfo(id, productId, deviceName, “”)

这就是官方sdkdemo里面连接设备的核心函数,其中setQcloudApiCred的两个参数就是demo登录时填的密钥secretIdsecretKey
这种方式做调试方便,但同时权限也是非常高,在正式App中使用不合适。

2.通过xp2p_info连接 (采用此方式)

  • setCallback(this)
  • startServiceWithXp2pInfo(id, productId, deviceName, “xxx”)

xp2p_info这个参数在设备上线时上传给SDK服务器,我们自建后台可以通过云API获取到。
初始化P2P连接时,给startServiceWithXp2pInfo()传入xp2p_info参数即可连接设备。

官网文档摘录:
SDK需要的xp2p info需要App侧从自己的业务后台获取;
获取到xp2p info后,可以通过上述的startServiceWithXp2pInfo接口将该info传给SDK,示例代码如下:

1
2
3
String xp2p_info = getXP2PInfo(...) // 从自建后台获取xp2p info
XP2P.setCallback(this)
XP2P.startServiceWithXp2pInfo(id, product_id, device_name, xp2p_info)

四、播放音视频

在连接上P2P的前提下,连接音视频也非常简单:

  • val flv_url = XP2P.delegateHttpFlv(id)
  • 使用ijkPlayer播放 flv_url

注意:如果P2P没有连接上,这里获取的flv_url为null

我分析这是将设备端的音视频封装为FLV格式,ijkPlayer本身是支持这些格式的,再经过自己魔改一
下ijkPlayer使得它支持P2P传输,所以App开发者也不需要自己解码了,给ijkPlayer配一个TextureView就能播放了。

五、说话、发送声音

步骤:

  • XP2P.postCommandRequestSync() 发送信令检查设备的状态(是否允许语音通话)
  • XP2P.runSendService() 启动服务
  • 录音PCM,PCM编码ACC,ACC封装为FLV
  • XP2P.dataSend() 发送FLV数据
  • XP2P.stopSendService() 停止服务

注意:语音编码可以采用其他如G711A、PCM,但必须封装为FLV,否则不能发送。

FLV格式请参考【FLV封装格式解析】

六、云台信令

  • postCommandRequestSync 发送信令

信令内容:

1
2
3
4
控制ipc左移:action=user_define&channel=xxx&cmd=ptz_left
控制ipc右移:action=user_define&channel=xxx&cmd=ptz_right
控制ipc上移:action=user_define&channel=xxx&cmd=ptz_up
控制ipc下移:action=user_define&channel=xxx&cmd=ptz_down

七、自定义信令交互

  • postCommandRequestSync 发送信令

格式: action=user_define&channel=xxx&cmd=xxx

自定义数据必须跟在 cmd=xxx 后面

八、回放

1.本地回放

  • postCommandRequestSync 用查询录像(action=inner_define&channel=0&cmd=get_record_index&start_time=000&end_time=111
  • ijkplayer点播(ipc.flv?action=playback&channel=xxx&start_time=xxx&end_time=yyy
  • 暂停回放、继续回放
  • 录像进度条滑动

2.云回放

  • 云API查询录像
  • 获取m3u8 URL
  • ijkplayer点播