导语
在说实现方式之前,先简单说下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去通知设备端即可。