
圖 1:基于AVAPIs的對講架構(gòu)及主通道復用示意圖
一、概述
TUTK P2P SDK v3.3+ 版本默認支持數(shù)據(jù)全雙工通信,無需額外創(chuàng)建獨立通道。P2P連接建立后,會自動創(chuàng)建主通道(基于 IOTC 0 通道,通過
avClientStartEx 和 avServStartEx 接口參數(shù)綁定),客戶端可通過該主通道同時實現(xiàn)直播視頻播放、音頻監(jiān)聽和對講音頻發(fā)送,無需額外開辟通道資源。二、音頻格式同步(公版APP標準流程)
對講功能啟動前,APP端需先向設(shè)備查詢支持的音頻格式(編碼方式、采樣率、位寬等),確保兩端音頻參數(shù)一致,避免播放異常。該過程通過 IO 控制指令(具體可參考:公版IOCommand定義)交互完成。
(一)APP端:查詢音頻格式(發(fā)送請求)
APP 調(diào)用
avSendIOCtrl 發(fā)送 IOTYPE_USER_IPCAM_GETAUDIOOUTFORMAT_REQ 指令,傳入攝像頭通道索引,查詢設(shè)備對講支持的音頻格式。// 查詢音頻格式請求結(jié)構(gòu)體
typedef struct {
unsigned int channel; // camera index(攝像頭索引,多攝像頭場景需指定)
char reserved[4]; // 預留字段,無需賦值
} SMsgAVIoctrlGetAudioOutFormatReq;
(二)設(shè)備端:回復音頻格式(響應請求)
設(shè)備端通過
avRecvIOCtrl 接收查詢請求后,回復 IOTYPE_USER_IPCAM_GETAUDIOOUTFORMAT_RESP 指令,返回支持的音頻參數(shù)。// 音頻格式響應結(jié)構(gòu)體
typedef struct {
unsigned int channel; // camera index(與請求的攝像頭索引一致)
int format; // 音頻編碼格式(參考 ENUM_CODECID 枚舉)
char sample_rate; // 采樣率(參考 Sample_Rate 枚舉)
char bitdata; // 位寬(參考 DATABITS 枚舉)
char channels; // 支持的聲道數(shù)(1=單聲道,2=立體聲)
char avservchannel; // 對講使用的通道類型:0=子通道;1=主通道;其他=子通道(默認0)
} SMsgAVIoctrlGetAudioOutFormatResp;
- 字段說明:
- format:音頻編碼格式,取值來自
CodecId枚舉(如 G711A、AAC 等); - sample_rate:采樣率,取值來自
Sample_Rate枚舉(如 8K、16K 等); - bitdata:數(shù)據(jù)位寬,取值來自
DATABITS枚舉(僅支持8位/16位); - avservchannel:推薦使用主通道(填1),復用現(xiàn)有連接資源。
- format:音頻編碼格式,取值來自
三、對講實現(xiàn)方式(主通道全雙工傳輸)
主通道本身支持全雙工通信,可同時傳輸“設(shè)備→APP的直播音頻”和“APP→設(shè)備的對講音頻”。APP通過特定IO指令通知設(shè)備開啟/關(guān)閉對講,之后通過音頻傳輸API發(fā)送/接收對講數(shù)據(jù)。
(一)核心IO控制指令(SDK內(nèi)置)
對講啟停通過以下2條SDK內(nèi)置IO指令控制(參考SDK Readme.htm第五部分):
IOTYPE_USER_IPCAM_SPEAKERSTART:開啟對講(APP→設(shè)備)IOTYPE_USER_IPCAM_SPEAKERSTOP:關(guān)閉對講(APP→設(shè)備)
(二)開啟對講流程
- 步驟1:APP端發(fā)送開啟指令
- 音頻格式同步完成后,APP 調(diào)用
avSendIOCtrl發(fā)送IOTYPE_USER_IPCAM_SPEAKERSTART指令,通知設(shè)備準備接收對講音頻; - 指令無需額外參數(shù)(參數(shù)長度填0),僅通過指令類型標識操作。
- 音頻格式同步完成后,APP 調(diào)用
- 步驟2:APP端啟動音頻采集與發(fā)送
- APP 啟動本地麥克風采集音頻,按設(shè)備支持的格式(編碼、采樣率等)進行編碼;
- 調(diào)用
avSendAudioData接口,通過主通道將編碼后的對講音頻數(shù)據(jù)發(fā)送給設(shè)備。
- 步驟3:設(shè)備端接收開啟指令并準備接收
- 設(shè)備通過
avRecvIOCtrl接收IOTYPE_USER_IPCAM_SPEAKERSTART指令,確認開啟對講; - 設(shè)備初始化音頻接收緩沖區(qū),調(diào)用
avRecvAudioData接口監(jiān)聽主通道的對講音頻數(shù)據(jù)。
- 設(shè)備通過
- 步驟4:設(shè)備端播放對講音頻
- 設(shè)備接收音頻數(shù)據(jù)后,按約定格式解碼,通過設(shè)備揚聲器播放,完成“APP→設(shè)備”的對講音頻傳輸。
(三)關(guān)閉對講流程
對講結(jié)束時,APP發(fā)送關(guān)閉指令,設(shè)備停止接收音頻,雙方釋放相關(guān)資源:
- 步驟1:APP端發(fā)送關(guān)閉指令:APP 調(diào)用
avSendIOCtrl發(fā)送IOTYPE_USER_IPCAM_SPEAKERSTOP指令; - 步驟2:APP端停止采集與發(fā)送:關(guān)閉麥克風,停止音頻編碼和
avSendAudioData調(diào)用; - 步驟3:設(shè)備端停止接收與播放:設(shè)備接收關(guān)閉指令后,停止
avRecvAudioData監(jiān)聽,關(guān)閉揚聲器,釋放音頻緩沖區(qū)。
