一、概述
本文檔聚焦Ceres多通道(通道0/1)拉流的核心實現(xiàn)方案,明確服務(wù)器、音箱端(Alexa/Google Hub)和設(shè)備端的關(guān)鍵操作步驟,適配雙路流并行傳輸場景。
核心原則:
- 通道0既支持指令傳輸也支持流傳輸,通道1僅支持流傳輸;
- 服務(wù)器采用串行方式建立多通道,設(shè)備端需延長通道創(chuàng)建超時時間;
- 音箱端需發(fā)起兩次獨立拉流請求,分別對應(yīng)通道0和通道1;
- 基于account標識和IOTC_Channel_ID區(qū)分通道類型,實現(xiàn)精準流傳輸控制。
二、API參考
多通道拉流僅使用拉流初始化接口,無需額外新增接口,支持以下3種認證類型的初始化接口:
(一)支持的拉流初始化接口
init_streaming:P2P場景下基于 account/password 認證init_streaming_v3:P2P場景下基于 avtoken/identity 認證init_streaming_v4:基于設(shè)備 credential 認證- 接口請求地址:https://domain:port/ceres(POST方法,Content-Type: application/json),接口請參考:Ceres拉流接口
(二)核心參數(shù)配置
| 通道 | 必填參數(shù) | 參數(shù)值 | 說明 |
|---|---|---|---|
| 通道0 | channel | 0 | 明確指定通道編號 |
| account(init_streaming)/ identity(init_streaming_v3) | ceres-channel-0 | 通道標識,可自定義但需與通道1區(qū)分 | |
| 通道1 | channel | 1 | 明確指定通道編號 |
| account(init_streaming)/ identity(init_streaming_v3) | ceres-channel-1 | 必須與通道0的標識嚴格區(qū)分 |
三、Ceres服務(wù)器實現(xiàn)
服務(wù)器接收拉流請求后,按通道編號執(zhí)行不同的連接邏輯,核心流程如下:
1. 通道0請求處理(channel=0)
- 直接與目標設(shè)備建立連接;
- 創(chuàng)建通道0的 AV Channel;
- 在通道0上發(fā)送流控制指令(IOTYPE_USER_IPCAM_START、IOTYPE_USER_IPCAM_AUDIOSTART);
- 拉取通道0的流數(shù)據(jù)。
2. 通道1請求處理(channel=1)
- 與目標設(shè)備建立連接;
- 先創(chuàng)建通道0的 AV Channel,通過通道0發(fā)送流控制指令;
- 再創(chuàng)建通道1的 AV Channel;
- 拉取通道1的流數(shù)據(jù)。
注意事項
服務(wù)器采用串行方式創(chuàng)建多通道(先通道0后通道1),設(shè)備端需將通道創(chuàng)建超時時間延長至合理值(建議≥30秒),避免連接失敗。
四、音箱端(Alexa/Google Hub)實現(xiàn)
音箱端需通過兩次獨立拉流請求獲取雙路流地址,核心步驟如下:
1. 發(fā)起拉流請求
- 調(diào)用拉流初始化接口(支持上述3種接口),分別發(fā)起通道0和通道1的拉流請求;
- 兩次請求的設(shè)備標識(device/UDID)必須一致,確保指向同一設(shè)備;
- 按參數(shù)配置要求填寫 channel 和 account/identity 字段(通道0填0和ceres-channel-0,通道1填1和ceres-channel-1)。
2. 流拉取與播放
- 接收服務(wù)器返回的兩個拉流URL(分別對應(yīng)通道0和通道1);
- 并行拉取兩路流數(shù)據(jù),分別解碼播放;
- 無需額外處理指令交互,僅需關(guān)注流數(shù)據(jù)的拉取與播放穩(wěn)定性。
3. 示例請求(通道0 curl)
通道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
4. 示例請求(通道1 curl)
通道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
五、設(shè)備端實現(xiàn)
設(shè)備端需監(jiān)聽服務(wù)器連接請求,創(chuàng)建雙AV通道并按規(guī)則處理流傳輸,核心步驟如下:
1. 通道創(chuàng)建
- 監(jiān)聽Ceres服務(wù)器的連接請求;
- 通過
IOTC_Channel_ID(0)和IOTC_Channel_ID(1)創(chuàng)建兩個獨立的 AV Channel; - 延長通道創(chuàng)建超時時間(建議≥30秒),適配服務(wù)器串行創(chuàng)建邏輯。
2. 身份判斷與流傳輸控制
基于
avServStartEx 接口的 outConfig.account 值判斷通道類型,按以下規(guī)則處理流傳輸:設(shè)備端核心邏輯偽代碼
// 設(shè)備端核心邏輯偽代碼
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();
}
}
3. 關(guān)鍵規(guī)則說明
- 通道0(account=ceres-channel-0):必須收到控制指令后才傳流,支持指令+流雙重傳輸;
- 通道1(account=ceres-channel-1):
- 若IOTC_Channel_ID=1:直接傳流,服務(wù)器不會在該通道發(fā)送控制指令;
- 若IOTC_Channel_ID=0:僅作為指令傳輸通道,收到控制指令后忽略,不觸發(fā)流傳輸。
