Tange Cloud for Device
 Rev.333
载入中...
搜索中...
未找到
画中画设备开发

实时流

设备端实现

实现画中画功能,首先设备要支持2路视频独立编码,每路都支持主辅双码流。

步骤:

  1. TciCB::get_feature() 的 "MultiChannels" 能力查询里返回 "2-composed" (参见 MultiChannels)
  2. 如果带云台,在"SupportPTZ"能力查询里返回一个数组。例如 ["No", "Yes"] (参见 SupportPTZ)
  3. TciCB::get_state() 回调里,返回默认的SD卡和云录像的视频通道和 码流。为与旧的app兼容,返回的字符串格式为 "码流:通道"。例如 "0:1" 表示1通道的主码流。
  4. 实现TciCB新增的回调 TciCB::request_iframe_ex(). 该回调相较于 TciCB::request_iframe() 新增了channel参数。
  5. 调用 TciSendFrameEx() , 把4路视频流及一路音频流送入sdk。
  6. 响应 TCI_CMD_SET_PRIMARY_VIEW 命令,用于做SD卡和云录像的码流切换(如果不是录全部码流)等。

APP端实现

APP端的的修改不用新增指令。但现有指令的参数结构需要微调.

涉及指令和数据结构变动

如下命令,需要给出正确的视频通道(channel)参数。

现有程序对部分指令的结构的channel参数使用有误(将channel用作avIndex),需要调整。

调整后的结构与之前保持二进制兼容。

  • TCI_CMD_START/TCI_CMD_STOP

    原结构定义如下:

    typedef struct
    {
    unsigned int channel; // Camera Index
    unsigned char reserved[4];
    } Tcis_AVStream;

    但channel实际用作p2p传输通道(avIndex),新结构定义如下:

    typedef struct
    {
    unsigned int avIndex; // p2p 通道号
    unsigned int channel; //视频通道号(或说 Camera Index): 0|1
    } 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; // Camera Index
    unsigned int command; // play record command. refer to ENUM_PLAYCONTROL
    unsigned int Param; // command param, that the user defined
    STimeDay stTimeDay; // Event time from ListEvent
    unsigned char reserved[4];
    时间的表示方法
    SD卡回放控制请求结构体 .

    但实际上channel用作avIndex。现作如下修改:

    typedef struct
    {
    unsigned int avIndex; // avIndex
    unsigned int command; // play record command. refer to ENUM_PLAYCONTROL
    unsigned int Param; // command param, that the user defined
    STimeDay stTimeDay; // Event time from ListEvent
    unsigned int channel; // Camera Index: 0~N

    注意以前对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

录像与回放

设备端

云录像

  • 固件只需要调用 TciSendFrameEx(),向SDK送入两个通道的高清标清码流即可。
  • 云端保存两路高清. 下面的逻辑不再支持
  • 固件在 TciCB::get_state() 回调里的 "CVideoQuality" 查询里,返回默认云录像的通道和码流。对画中画设备,这个值是主画面的设置。SDK自动选择另一个视频通道的辅码流作为子画面。
  • 用户在APP上交换主、子画面,设备会收到 TCI_CMD_SET_PRIMARY_VIEW 通知。如果设备端希望云端存储同APP 显示同步,可以调用 TciSetCloudStream() 显式改变云存储设置。

SDK卡回放

  • 调用 TciSendPbFrame() 时,第二个参数 mt 的低16位为媒体类型,bit16用来作子画面标志(0:主画面;1:子画面)

APP端

云录像回放

  • 云录像之前用一个 16位无符号整数 表示帧类型。现修改为低8位为媒体类型,bit8为主(0)、子(1)画面标志。
typedef struct {
uint16_t mediaType; ///< bit0~7:媒体类型;bit8:主子画面标识
uint16_t keyFrame;
uint32_t length;
uint32_t timestamp;
uint32_t flags;
} __attribute__((__packed__)) McFrameTransformHeader;
  • 跳转时等待I帧的问题

SD卡录像回放

帧头 FRAMEINFO_tcodec_id成员,低8位仍为媒体类型,bit8为子画面标志。其它不变

/* Audio/Video Frame Header Info */
typedef struct _FRAMEINFO
{
unsigned short codec_id; // bit8为子画面标志。bit0~7为媒体类型:
// MEDIA_CODEC_AUDIO_PCMLE16 for audio,
// MEDIA_CODEC_VIDEO_H264 for video.
// ...
......
}FRAMEINFO_t;