实时流
设备端实现
实现画中画功能,首先设备要支持2路视频独立编码,每路都支持主辅双码流。
步骤:
- 在 TciCB::get_feature() 的 "MultiChannels" 能力查询里返回 "2-composed" (参见 MultiChannels)
- 如果带云台,在"SupportPTZ"能力查询里返回一个数组。例如
["No", "Yes"]
(参见 SupportPTZ)
- 在 TciCB::get_state() 回调里,返回默认的SD卡和云录像的视频通道和 码流。为与旧的app兼容,返回的字符串格式为 "码流:通道"。例如 "0:1" 表示1通道的主码流。
- 实现TciCB新增的回调 TciCB::request_iframe_ex(). 该回调相较于 TciCB::request_iframe() 新增了channel参数。
- 调用 TciSendFrameEx() , 把4路视频流及一路音频流送入sdk。
- 响应 TCI_CMD_SET_PRIMARY_VIEW 命令,用于做SD卡和云录像的码流切换(如果不是录全部码流)等。
APP端实现
APP端的的修改不用新增指令。但现有指令的参数结构需要微调.
涉及指令和数据结构变动
如下命令,需要给出正确的视频通道(channel)参数。
现有程序对部分指令的结构的channel参数使用有误(将channel用作avIndex),需要调整。
调整后的结构与之前保持二进制兼容。
TCI_CMD_START/TCI_CMD_STOP
原结构定义如下:
typedef struct
{
unsigned int channel;
unsigned char reserved[4];
} Tcis_AVStream;
但channel实际用作p2p传输通道(avIndex),新结构定义如下:
typedef struct
{
unsigned int avIndex;
unsigned int channel;
} Tcis_AVStream;
注意以前对channel的赋值现在要赋给avIndex
- TCI_CMD_SETSTREAMCTRL_REQ/TCI_CMD_GETSTREAMCTRL_RESP
- TCI_CMD_SETRECORD_REQ/TCI_CMD_GETRECORD_RESP
TCI_CMD_SET_CLOUD_VIDEO_QUALITY_REQ/TCI_CMD_GET_CLOUD_VIDEO_QUALITY_RESP
无需改变。对channel赋正确的值。
TCI_CMD_RECORD_PLAYCONTROL (2020/9/1 Deprecated)
原结构定义如下:
typedef struct
{
unsigned int channel;
unsigned int command;
unsigned int Param;
unsigned char reserved[4];
但实际上channel用作avIndex。现作如下修改:
typedef struct
{
unsigned int avIndex;
unsigned int command;
unsigned int Param;
unsigned int channel;
注意以前对channel的赋值现在要赋给avIndex
现在的channel要设为 Camera Index
- TCI_CMD_GET_FEATURE 的setting 返回中新增:
- "CloudStorageChannel": 云存储通道
- "DefPreviewChannel": 默认预览通道
其它
- 停止画中画:对子画面调用 TCI_CMD_STOP
- 主、子画面切换: 对主、子画面调用 TCI_CMD_SETSTREAMCTRL_REQ 重设码流
- APP在请求主画面前调用 @ref TCI_CMD_GET_PRIMARY_VIEW 查询当前主画面通道
- APP 在切换主、子画面时调用 TCI_CMD_SET_PRIMARY_VIEW 通知设备端
- SD卡和云存储录像设置,现在可能要增加视频通道选择UI
录像与回放
设备端
云录像
SDK卡回放
APP端
云录像回放
- 云录像之前用一个 16位无符号整数 表示帧类型。现修改为低8位为媒体类型,bit8为主(0)、子(1)画面标志。
typedef struct {
uint16_t mediaType;
uint16_t keyFrame;
uint32_t length;
uint32_t timestamp;
uint32_t flags;
} __attribute__((__packed__)) McFrameTransformHeader;
SD卡录像回放
帧头 FRAMEINFO_t
的 codec_id
成员,低8位仍为媒体类型,bit8为子画面标志。其它不变
typedef struct _FRAMEINFO
{
unsigned short codec_id;
......
}FRAMEINFO_t;