视频直播

更新时间:2023-05-25 06:23:52

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

整体流程如下图所示:

视频直播

初始化

创建 P2P 对象

接口说明

创建 IThingSmartCameraP2P 对象,用来支持此设备预览。

IThingSmartCameraP2P createCameraP2P(String devId);

参数说明

参数 说明
devId 设备 ID

示例代码

IThingIPCCore cameraInstance = ThingIPCSdk.getCameraInstance();
if (cameraInstance != null) {
    cameraInstance.createCameraP2P(devId));
}

引入渲染视图容器

ThingCameraView 是 IPC SDK 为页面布局文件提供的视频渲染视图容器。

如果您需要使用自己的视频渲染视图,只需实现 IRegistorIOTCListener 接口,再将您自己的视频渲染视图和 IThingSmartCameraP2P 对象绑定即可。

<com.thingclips.smart.camera.middleware.widget.ThingCameraView
  android:id="@+id/camera_video_view"
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  />

渲染视图创建完成和单击事件回调

接口说明

public void setViewCallback(AbsVideoViewCallback callback);

参数说明

参数 说明
callback 回调接口

示例代码

ThingCameraView mVideoView = findViewById(R.id.camera_video_view);
mVideoView.setViewCallback(new AbsVideoViewCallback() {
    @Override
    public void onCreated(Object view) {
        super.onCreated(view);
        //渲染视图构造完成时回调
    }
});

AbsVideoViewCallback

AbsVideoViewCallback 为渲染视图回调抽象类,您可以重写自己需要的回调,一般重写 onCreated 方法。

接口说明

渲染视图容器构造完成时回调。

public void onCreated(Object view);

接口说明

单击视图时回调。

public void videoViewClick();

渲染视图滑动触摸事件回调

接口说明

设置触发视图滑动操作时回调。

public void setOnRenderDirectionCallback(OnRenderDirectionCallback onRenderDirectionCallback);

参数说明

参数 说明
onRenderDirectionCallback 触摸事件回调接口

OnRenderDirectionCallback

OnRenderDirectionCallback 为渲染视图触摸事件的抽象类,您可以利用此方法来实现云台 PTZ 功能。

public interface OnRenderDirectionCallback {
    //左滑
    void onLeft();
    //右滑
    void onRight();
    //上滑
    void onUp();
    //下滑
    void onDown();
    //手指抬起,取消
    void onCancel();
}

构造渲染视图

接口说明

public void createVideoView(String devId);

参数说明

参数 说明
devId 设备 ID

示例代码

ThingCameraView mVideoView = findViewById(R.id.camera_video_view);
mVideoView.createVideoView(devId);

获取渲染视图

如果未构造视频渲染视图,会返回 null。

接口说明

public Object createdView();

示例代码

ThingCameraView mVideoView = findViewById(R.id.camera_video_view);
mVideoView.createdView();

P2P 对象绑定渲染视图

IThingSmartCameraP2P 对象绑定视频渲染视图。

接口说明

void generateCameraView(T view);

示例代码

mCameraP2P.generateCameraView(mVideoView.createdView());

注册 P2P 监听

IThingSmartCameraP2P 对象注册监听器,否则无法正常显示画面。

接口说明

void registerP2PCameraListener(AbsP2pCameraListener listener);

完整示例代码

// 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);
        //4. 渲染视图构造完成时,为 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);
}

连接 P2P 通道

在开始视频播放之前,需要先连接 P2P 通道。

IPC SDK 只负责下发指令和接收摄像机响应结果,您需要自行维护 P2P 状态。

接口说明

连接 P2P 通道。

void connect(String devId, OperationDelegateCallBack callBack);

接口说明

连接 P2P 通道,并指定优先连接方式。

void connect(String devId, int mode, OperationDelegateCallBack callBack);

参数说明

参数 说明
mode 连接方式
  • 0:代表自动选择
  • 1:代表外网连接优先
  • 3:代表局域网连接优先

断开 P2P 通道

接口说明

void disconnect(String devId, OperationDelegateCallBack callBack);

参数说明

参数 说明
callBack 操作结果回调

示例代码

mCameraP2P.connect(devId, new OperationDelegateCallBack() {
    @Override
    public void onSuccess(int sessionId, int requestId, String data) {
        //连接成功
    }

    @Override
    public void onFailure(int sessionId, int requestId, int errCode) {
        //连接失败
    }
});

实时播放视频

P2P 连接成功之后,就能进行实时视频播放了。

接口说明

开始播放实时视频。

void startPreview(int clarity, OperationDelegateCallBack callBack);

接口说明

停止播放实时视频。

int stopPreview(OperationDelegateCallBack callBack);

参数说明

参数 说明
clarity 清晰度模式
  • 2:代表标清
  • 4:代表高清
callBack 操作结果回调

示例代码

mCameraP2P.startPreview(new OperationDelegateCallBack() {
    @Override
    public void onSuccess(int sessionId, int requestId, String data) {
        //开始播放实时视频成功
    }

    @Override
    public void onFailure(int sessionId, int requestId, int errCode) {
        //开始播放实时视频失败
    }
});

startPreview 开始播放实时视频成功回调之后,onReceiveFrameYUVData 回调会开始接收视频数据,并传递给业务层。

销毁 P2P 对象

不再使用 IPC 功能的时候,请务必注销 P2P 监听器和销毁 IThingSmartCameraP2P 对象。

接口说明

注销 P2P 监听器。

void removeOnP2PCameraListener(AbsP2pCameraListener listener);

接口说明

删除 P2P 对象。

void destroyP2P();

示例代码

@Override
public void onDestroy() {
    if (null != mCameraP2P) {
        mCameraP2P.removeOnP2PCameraListener(absP2pCameraListener);
        mCameraP2P.destroyP2P();
    }
}