视频直播

更新时间:2024-06-17 02:45:31下载pdf

视频直播需要先创建 IThingSmartCameraP2P 对象,然后进行 P2P(Peer-to-peer)通道连接。P2P 连接成功后,就可以播放实时视频、查看截图、录制视频、实时对讲数据传输。

流程说明

视频直播

核心接口

演示录屏 接口 描述 备注
IThingIPCCore createCameraP2P 创建 camera 对象 一个设备 ID 对应一个 camera 对象
IThingSmartCameraP2P connect 连接 -3 或 -105 建议重连。
更多信息,参考 错误码查询
IThingSmartCameraP2P startPreview 拉流 拉流回调成功后,VideoView 开始播放。
更多信息,参考 错误码查询
IThingSmartCameraP2P stopPreview 停止拉流 -
IThingSmartCameraP2P disconnect 断连 设备不需要连接时,需要及时断开释放 P2P 会话

重点关注

注意不要在 IThingSmartCameraP2P 对象调用方法的回调函数里(可能异步调用)调用该对象的其他 API。否则,可能会造成死锁。

核心代码

连接

void connect(String devId, OperationDelegateCallBack callBack);

拉流

void startPreview(int clarity, OperationDelegateCallBack callBack);

停流

int stopPreview(OperationDelegateCallBack callBack);

断连

void destroyP2P();

Java:

// 1. 创建 IThingSmartCameraP2P
IThingSmartCameraP2P mCameraP2P = null;
IThingIPCCore cameraInstance = ThingIPCSdk.getCameraInstance();
if (cameraInstance != null) {
    mCameraP2P = cameraInstance.createCameraP2P(devId));
}
ThingCameraView mVideoView = findViewById(R.id.camera_video_view);
// 2. 为渲染视图容器设置回调
mVideoView.setViewCallback(new AbsVideoViewCallback() {
    @Override
    public void onCreated(Object view) {
        super.onCreated(view);
        // 渲染视图构造完成时,为 IThingSmartCameraP2P 绑定渲染视图
        if (null != mCameraP2P){
            mCameraP2P.generateCameraView(view);
        }
    }
});
// 3. 构造渲染视图
mVideoView.createVideoView(devId);
// 4. 注册 P2P 监听
AbsP2pCameraListener absP2pCameraListener = new AbsP2pCameraListener() {
    @Override
    public void onSessionStatusChanged(Object camera, int sessionId, int sessionStatus) {
            super.onSessionStatusChanged(camera, sessionId, sessionStatus);
            // sessionStatus = -3 (超时)或 -105(鉴权失败) 时,建议发起一次重连,注意避免循环
            }
};
if (null != mCameraP2P){
    mCameraP2P.registerP2PCameraListener(absP2pCameraListener);
}
// 5. 连接 P2P
if (null != mCameraP2P){
mCameraP2P.connect(devId, new OperationDelegateCallBack() {
    @Override
    public void onSuccess(int sessionId, int requestId, String data) {
        //连接成功,发送 Handler 消息回到主线程再发起拉流
    }

    @Override
    public void onFailure(int sessionId, int requestId, int errCode) {
        //连接失败
    }
});
}
// 6. 拉流
if (null != mCameraP2P){
mCameraP2P.startPreview(new OperationDelegateCallBack() {
    @Override
    public void onSuccess(int sessionId, int requestId, String data) {
        //开始播放实时视频成功
    }

    @Override
    public void onFailure(int sessionId, int requestId, int errCode) {
        //开始播放实时视频失败
    }
});
}
// 7. 在页面关闭或者不需要拉流时,停流释放 P2P 会话
@Override
public void onDestroy() {
    if (null != mCameraP2P) {
        // 不需要拉流时,停止拉流
        mCameraP2P.stopPreview(null);

        mCameraP2P.disconnect(devId,null);
        mCameraP2P.removeOnP2PCameraListener(absP2pCameraListener);
        mCameraP2P.destroyP2P();
    }
}