一、概述
本文档聚焦Ceres多通道(通道0/1)拉流的核心实现方案,明确服务器、音箱端(Alexa/Google Hub)和设备端的关键操作步骤,适配双路流并行传输场景。
核心原则:
1. 通道0既支持指令传输也支持流传输,通道1仅支持流传输;
2. 服务器采用串行方式建立多通道,设备端需延长通道创建超时时间;
3. 音箱端需发起两次独立拉流请求,分别对应通道0和通道1;
4. 基于account标识和IOTC_Channel_ID区分通道类型,实现精准流传输控制。
二、API参考
多通道拉流仅使用拉流初始化接口,无需额外新增接口,支持以下3种认证类型的初始化接口:
1. init_streaming:P2P场景下基于 account/password 认证
2. init_streaming_v3:P2P场景下基于 avtoken/identity 认证
3. init_streaming_v4:基于设备 credential 认证
接口请求地址:https://domain:port/ceres(POST方法,Content-Type: application/json)
| 通道 | 必填参数 | 参数值 | 说明 |
|---|---|---|---|
| 通道0 | channel | 0 | 明确指定通道编号 |
| account(init_streaming)/ identity(init_streaming_v3) | ceres-channel-0 | 通道标识,可自定义但需与通道1区分 | |
| 通道1 | channel | 1 | 明确指定通道编号 |
| account(init_streaming)/ identity(init_streaming_v3) | ceres-channel-1 | 必须与通道0的标识严格区分 |
三、Ceres服务器实现
服务器接收拉流请求后,按通道编号执行不同的连接逻辑,核心流程如下:
① 直接与目标设备建立连接;
② 创建通道0的 AV Channel;
③ 在通道0上发送流控制指令(IOTYPE_USER_IPCAM_START、IOTYPE_USER_IPCAM_AUDIOSTART);
④ 拉取通道0的流数据。
① 与目标设备建立连接;
② 先创建通道0的 AV Channel,通过通道0发送流控制指令;
③ 再创建通道1的 AV Channel;
④ 拉取通道1的流数据。
服务器采用串行方式创建多通道(先通道0后通道1),设备端需将通道创建超时时间延长至合理值(建议≥30秒),避免连接失败。
四、音箱端(Alexa/Google Hub)实现
音箱端需通过两次独立拉流请求获取双路流地址,核心步骤如下:
① 调用拉流初始化接口(支持上述3种接口),分别发起通道0和通道1的拉流请求;
② 两次请求的设备标识(device/UDID)必须一致,确保指向同一设备;
③ 按参数配置要求填写 channel 和 account/identity 字段(通道0填0和ceres-channel-0,通道1填1和ceres-channel-1)。
① 接收服务器返回的两个拉流URL(分别对应通道0和通道1);
② 并行拉取两路流数据,分别解码播放;
③ 无需额外处理指令交互,仅需关注流数据的拉取与播放稳定性。
// 通道0拉流请求(curl命令)
curl -XPOST -d 'query {
init_streaming(
authToken:"dm verify token",
authType:"Bearer",
device:"device UID",
account:"ceres-channel-0",
password:"secret",
protocol:"rtsp",
realm:"rd",
state:"state",
channel:0
){
code,
url,
msg
}
}' https://domain:port/ceres// 通道1拉流请求(curl命令)
curl -XPOST -d 'query {
init_streaming(
authToken:"dm verify token",
authType:"Bearer",
device:"device UID",
account:"ceres-channel-1",
password:"secret",
protocol:"rtsp",
realm:"rd",
state:"state",
channel:1
){
code,
url,
msg
}
}' https://domain:port/ceres五、设备端实现
设备端需监听服务器连接请求,创建双AV通道并按规则处理流传输,核心步骤如下:
① 监听Ceres服务器的连接请求;
② 通过 IOTC_Channel_ID(0) 和 IOTC_Channel_ID(1) 创建两个独立的 AV Channel;
③ 延长通道创建超时时间(建议≥30秒),适配服务器串行创建逻辑。
基于 avServStartEx 接口的 outConfig.account 值判断通道类型,按以下规则处理流传输:
// 设备端核心逻辑伪代码
if (outConfig.account == "ceres-channel-0") {
// 通道0:收到控制指令后开始传流
if (receivedCmd == IOTYPE_USER_IPCAM_START || receivedCmd == IOTYPE_USER_IPCAM_AUDIOSTART) {
startStream(IOTC_Channel_ID = 0); // 传输通道0的流
}
}
else if (outConfig.account == "ceres-channel-1") {
if (IOTC_Channel_ID == 1) {
// 通道1:直接传流,无需等待控制指令
startStream(IOTC_Channel_ID = 1); // 传输通道1的流
} else if (IOTC_Channel_ID == 0 && (receivedCmd == IOTYPE_USER_IPCAM_START || receivedCmd == IOTYPE_USER_IPCAM_AUDIOSTART)) {
// 通道0收到通道1的指令:仅用于指令传输,忽略并不传流
ignoreCmd();
}
}① 通道0(account=ceres-channel-0):必须收到控制指令后才传流,支持指令+流双重传输;
② 通道1(account=ceres-channel-1):
- 若IOTC_Channel_ID=1:直接传流,服务器不会在该通道发送控制指令;
- 若IOTC_Channel_ID=0:仅作为指令传输通道,收到控制指令后忽略,不触发流传输。
