多目 IPC

更新时间:2024-04-26 08:49:27下载pdf

IPC SDK 支持多个摄像头一起显示,目前采用的是视频分割协议进行多目视频分割渲染,需要设备支持。

是否支持视频分割协议

接口说明

获取设备是否支持 IPC 视频流分割高级能力,返回布尔类型。

boolean isSupportVideoSegmentation();

示例代码

IThingIPCCore cameraInstance = ThingIPCSdk.getCameraInstance();
if (cameraInstance != null) {
    ICameraConfigInfo cameraConfig = cameraInstance.getCameraConfig(deviceId);
    return cameraConfig != null && cameraConfig.isSupportVideoSegmentation();
}

获取视频分割协议

接口说明

获取视频分割协议,返回 ThingVideoSplitInfo 封装模型。

ThingVideoSplitInfo getCameraVideoSegmentationModel();

ThingVideoSplitInfo 说明

参数 说明
total_split_num 视频分割路数
split_info 视频分割信息数组
split_info.index 镜头 ID
split_info.type 根据 type 值,选择绘制对应的视频流
  • -1:单路流
  • 0:全部
  • 1:球机
  • 2:枪机
split_info.res_pos 视频分割坐标信息
align_info 视频窗口组合及定位器位置信息,按需解析
align_info.align_type 视频窗口排列组合标识,约定值:
  • 20:双目两视频窗口上下垂直排列
  • 21:双目两视频窗口左右并列
  • 30:三目三个视频窗口上下垂直排列(暂时无此形态设备,不支持)
  • 31:三目上面一个,下面两个左右并列
  • 32:三目上面两个左右并列,下面一个
align_info.align_group 组合顺序,数组内的数字与 split_info.index 对应,数组内非数组独享一行(同行),嵌套的数组并列共享一行(同列)
align_info.localizer_group 包含具体定位器的位置 split_info.index,不支持跨列配置

示例代码

IThingIPCCore cameraInstance = ThingIPCSdk.getCameraInstance();
if (cameraInstance != null) {
    ICameraConfigInfo cameraConfig = cameraInstance.getCameraConfig(deviceId);
    if(cameraConfig != null && cameraConfig.isSupportVideoSegmentation()){
        ThingVideoSplitInfo videoSplitInfo = cameraConfig.getCameraVideoSegmentationModel();
    }
}

渲染视图绑定渲染类型

设置渲染视图的类型,说明要渲染的是球机、枪机,还是分割前画⾯。

要在 ThingCameraView.createVideoView 之后调用 setType

void setType(int type);

入参说明

参数 说明
type 对应协议下面的 split_info.type
  • 0:分割前全部画面
  • 1:球机
  • 2:枪机

示例代码

ThingVideoSplitInfo.SplitInfo splitInfo = mThingVideoSplitInfo.getSplit_info();
ThingCameraView mVideoView = findViewById(R.id.camera_video_view);

...

mVideoView.setType(splitInfo.getType());

渲染视图绑定渲染镜头

接口说明

给渲染视图设置绑定镜头 ID,指定要渲染的是哪个 IPC。

要在 ThingCameraView.createVideoView 之后调用 setIndex

void setIndex(int index);

入参说明

参数 说明
index 镜头 ID,对应协议下面的 split_info.index

示例代码

ThingVideoSplitInfo.SplitInfo splitInfo = mThingVideoSplitInfo.getSplit_info();
ThingCameraView mVideoView = findViewById(R.id.camera_video_view);

...

mVideoView.setIndex(splitInfo.getIndex());

多目渲染视图容器 ThingMultiCameraView

基于 ThingCameraView 二次封装的多目播放器,目前提供双目上下/左右排列,三目品字/倒品字排列共四种展示样式,并支持镜头上的定位器。

示例代码

IThingSmartCameraP2P mCameraP2P = null;
IThingIPCCore cameraInstance = ThingIPCSdk.getCameraInstance();
if (cameraInstance != null) {
    mCameraP2P = cameraInstance.createCameraP2P(devId));
}
//可通过布局引入
ThingMultiCameraView thingCameraView = new ThingMultiCameraView(context);
//设置分割协议
thingCameraView.setThingVideoSplitInfo(videoSplitInfo);
//设置播放器宽度
thingCameraView.setCameraViewWidth(widthPixels);

thingCameraView.setViewCallback(new AbsVideoViewCallback() {
    @Override
    public void onCreated(Object view) {
        super.onCreated(view);
        //
        渲染视图构造完成时,为 IThingSmartCameraP2P 绑定渲染视图
        if (null != mCameraP2P){
            mCameraP2P.generateCameraView(view);
        }
    }
});
thingCameraView.createVideoView(devId);

协议示例

协议是和设备端的约定。SDK 对接时,请咨询涂鸦项目经理提供方案。
以下提供一份三目分割协议示例:

{
  "total_split_num":3,
  "split_info":[
    {
      "index":1,
      "type":1,
      "res_pos":[[0,0,640,720],[0,0,960,1080]]
    },
    {
      "index":2,
      "type":2,
      "res_pos":[[0,720,640,720],[0,1080,960,1080]]
    },
    {
      "index":3,
      "type":2,
      "res_pos":[[0,720,1280,720],[0,1080,1920,1080]]
    }
  ],
  "align_info":{
    "align_type":32,
    "align_group":[[1, 3],[2]],
    "localizer_group":[1,3]
  }
}