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