
图 1:基于AVAPIs的对讲架构及主通道复用示意图
一、概述
TUTK P2P SDK v3.3+ 版本默认支持数据全双工通信,无需额外创建独立通道。P2P连接建立后,会自动创建主通道(基于 IOTC 0 通道,通过
avClientStartEx 和 avServStartEx 接口参数绑定),客户端可通过该主通道同时实现直播视频播放、音频监听和对讲音频发送,无需额外开辟通道资源。二、音频格式同步(公版APP标准流程)
对讲功能启动前,APP端需先向设备查询支持的音频格式(编码方式、采样率、位宽等),确保两端音频参数一致,避免播放异常。该过程通过 IO 控制指令(具体可参考:公版IOCommand定义)交互完成。
(一)APP端:查询音频格式(发送请求)
APP 调用
avSendIOCtrl 发送 IOTYPE_USER_IPCAM_GETAUDIOOUTFORMAT_REQ 指令,传入摄像头通道索引,查询设备对讲支持的音频格式。// 查询音频格式请求结构体
typedef struct {
unsigned int channel; // camera index(摄像头索引,多摄像头场景需指定)
char reserved[4]; // 预留字段,无需赋值
} SMsgAVIoctrlGetAudioOutFormatReq;
(二)设备端:回复音频格式(响应请求)
设备端通过
avRecvIOCtrl 接收查询请求后,回复 IOTYPE_USER_IPCAM_GETAUDIOOUTFORMAT_RESP 指令,返回支持的音频参数。// 音频格式响应结构体
typedef struct {
unsigned int channel; // camera index(与请求的摄像头索引一致)
int format; // 音频编码格式(参考 ENUM_CODECID 枚举)
char sample_rate; // 采样率(参考 Sample_Rate 枚举)
char bitdata; // 位宽(参考 DATABITS 枚举)
char channels; // 支持的声道数(1=单声道,2=立体声)
char avservchannel; // 对讲使用的通道类型:0=子通道;1=主通道;其他=子通道(默认0)
} SMsgAVIoctrlGetAudioOutFormatResp;
- 字段说明:
- format:音频编码格式,取值来自
CodecId枚举(如 G711A、AAC 等); - sample_rate:采样率,取值来自
Sample_Rate枚举(如 8K、16K 等); - bitdata:数据位宽,取值来自
DATABITS枚举(仅支持8位/16位); - avservchannel:推荐使用主通道(填1),复用现有连接资源。
- format:音频编码格式,取值来自
三、对讲实现方式(主通道全双工传输)
主通道本身支持全双工通信,可同时传输“设备→APP的直播音频”和“APP→设备的对讲音频”。APP通过特定IO指令通知设备开启/关闭对讲,之后通过音频传输API发送/接收对讲数据。
(一)核心IO控制指令(SDK内置)
对讲启停通过以下2条SDK内置IO指令控制(参考SDK Readme.htm第五部分):
IOTYPE_USER_IPCAM_SPEAKERSTART:开启对讲(APP→设备)IOTYPE_USER_IPCAM_SPEAKERSTOP:关闭对讲(APP→设备)
(二)开启对讲流程
- 步骤1:APP端发送开启指令
- 音频格式同步完成后,APP 调用
avSendIOCtrl发送IOTYPE_USER_IPCAM_SPEAKERSTART指令,通知设备准备接收对讲音频; - 指令无需额外参数(参数长度填0),仅通过指令类型标识操作。
- 音频格式同步完成后,APP 调用
- 步骤2:APP端启动音频采集与发送
- APP 启动本地麦克风采集音频,按设备支持的格式(编码、采样率等)进行编码;
- 调用
avSendAudioData接口,通过主通道将编码后的对讲音频数据发送给设备。
- 步骤3:设备端接收开启指令并准备接收
- 设备通过
avRecvIOCtrl接收IOTYPE_USER_IPCAM_SPEAKERSTART指令,确认开启对讲; - 设备初始化音频接收缓冲区,调用
avRecvAudioData接口监听主通道的对讲音频数据。
- 设备通过
- 步骤4:设备端播放对讲音频
- 设备接收音频数据后,按约定格式解码,通过设备扬声器播放,完成“APP→设备”的对讲音频传输。
(三)关闭对讲流程
对讲结束时,APP发送关闭指令,设备停止接收音频,双方释放相关资源:
- 步骤1:APP端发送关闭指令:APP 调用
avSendIOCtrl发送IOTYPE_USER_IPCAM_SPEAKERSTOP指令; - 步骤2:APP端停止采集与发送:关闭麦克风,停止音频编码和
avSendAudioData调用; - 步骤3:设备端停止接收与播放:设备接收关闭指令后,停止
avRecvAudioData监听,关闭扬声器,释放音频缓冲区。
