基于AVAPIs的对讲实现
导语
在说实现方式之前,先简单说下avIndex。3.3以上的SDK,默认已经支持数据全双工通信。

在连接一创建,就会建立一个主通道(即使用IOTC的0通道创建的那个通道,详情可见avClientStartE和avServStartEx的参数),然后客户端通过主通道去观看视频。
音频格式同步(公版APP做法)
APP端将发送IOTYPE_USER_IPCAM_GETAUDIOOUTFORMAT_REQ向设备查询对讲支持的音频格式。
参数如下:
typedef struct {
unsigned int channel; // camera index
char reserved[4];
} SMsgAVIoctrlGetAudioOutFormatReq;设备端回复指令IOTYPE_USER_IPCAM_GETAUDIOOUTFORMAT_RESP,
参数如下:
typedef struct {
unsigned int channel; // camera index
int format; // 参考ENUM_CODECID in AVFRAMEINFO.h
char sample_rate;
char bitdata;
char channels; // 可支持的通道数量
char avservchannel; // 0:子通道;1:主通道;otherwise:子通道(默认0)
} SMsgAVIoctrlGetAudioOutFormatResp;
enum Sample_Rate {
AUDIO_SAMPLE_8K = 0,
AUDIO_SAMPLE_11K = 1,
AUDIO_SAMPLE_12K = 2,
AUDIO_SAMPLE_16K = 3,
AUDIO_SAMPLE_22K = 4,
AUDIO_SAMPLE_24K = 5,
AUDIO_SAMPLE_32K = 6,
AUDIO_SAMPLE_44K = 7,
AUDIO_SAMPLE_48K = 8
}
enum CodecId {
MEDIA_CODEC_UNKNOWN = 0x00,
MEDIA_CODEC_VIDEO_MPEG4 = 0x4C, // 76
MEDIA_CODEC_VIDEO_H263 = 0x4D, // 77
MEDIA_CODEC_VIDEO_H264 = 0x4E, // 78
MEDIA_CODEC_VIDEO_MJPEG = 0x4F, // 79
MEDIA_CODEC_VIDEO_HEVC = 0x50, // 80
MEDIA_CODEC_AUDIO_AAC_RAW = 0x86, // 134
MEDIA_CODEC_AUDIO_AAC_ADTS = 0x87, // 135
MEDIA_CODEC_AUDIO_AAC_LATM = 0x88, // 136
MEDIA_CODEC_AUDIO_G711U = 0x89, // 137
MEDIA_CODEC_AUDIO_G711A = 0x8A, // 138
MEDIA_CODEC_AUDIO_ADPCM = 0x8B, // 139
MEDIA_CODEC_AUDIO_PCM = 0x8C, // 140
MEDIA_CODEC_AUDIO_SPEEX = 0x8D, // 141
MEDIA_CODEC_AUDIO_MP3 = 0x8E, // 142
MEDIA_CODEC_AUDIO_G726 = 0x8F // 143
}
enum DATABITS {
AUDIO_DATABITS_8 = 0,
AUDIO_DATABITS_16 = 1
}实现方式
因为主通道是一个全双工的通道,所以我们可以在这个主通道上面去传对讲的音频。
那么客户端怎么通知设备开启对讲呢?
我们的IO Ctrl定义里面2条指令(可以参考SDK Readme.htm第五部分):
- IOTYPE_USER_IPCAM_SPEAKERSTART => 用以开启对讲
- IOTYPE_USER_IPCAM_SPEAKERSTOP => 用以关闭对讲
APP通过avSendIOCtrl发送IOTYPE_USER_IPCAM_SPEAKERSTART之后,就可以调用avSendAudioData给设备发送声音了。
设备端通过avRecvIOCtrl接收到IOTYPE_USER_IPCAM_SPEAKERSTART之后,就可以调用avRecvAudioData去接收APP传过来的声音了。
同理,如果要结束对讲,则通过IOTYPE_USER_IPCAM_SPEAKERSTOP去通知设备端即可。
