s32Ret =HI_MPI_ADEC_SendStream(s32AdecChn, &stAudioStream, HI_TRUE);
if (s32Ret)
{
printf("%s:HI_MPI_ADEC_SendStream(%d) failed with %#x!\n",\
__FUNCTION__,s32AdecChn, s32Ret);
break;
}
0xA018800F HI_ERR_ADEC_BUF_FULL 解码通道缓存满。感觉应该是播放不了,也就是audio data送不出去导致的。
海思语音编解码库进行 G711、G726、ADPCM 格式的编码,编码后的码流遵循以下表格中描述的帧结构,即在每帧码流数据的净荷数据之前填充有 4 个字节的帧头;使用语音编解码库进行以上格式的解码时,需要读取相应的帧头信息。
这4个字节的帧头内容即为如下数组中的值:
static char aryHeard[4] = {00,01,A0,00}; //hisi audio header
Sample_audio录音数据是320+4为一个语音帧长,也就是4字节的header+320字节的data。
实际上,我认为海思SDK中的sample_audio.c中的设置是不正确的。如下:
/* init stAio. all of cases will use it */
stAioAttr.enSamplerate =AUDIO_SAMPLE_RATE_8000;
stAioAttr.enBitwidth = AUDIO_BIT_WIDTH_16;
stAioAttr.enWorkmode = AIO_MODE_I2S_MASTER;
stAioAttr.enSoundmode =AUDIO_SOUND_MODE_MONO;
stAioAttr.u32EXFlag = 1;
stAioAttr.u32FrmNum = 30;
stAioAttr.u32PtNumPerFrm = 320; //这里为什么是320字节?显然,按
(samplerate*channels*bits)/(FrmNum*8)来计算的话,是1066字节。
stAioAttr.u32ChnCnt = 2; //这个实际上就是channel。
我建议修改为:
stAioAttr.u32FrmNum = 50;
stAioAttr.u32PtNumPerFrm = 640;
下面是转一个童鞋的研究:
利用ACODEC库进行音频解码播放时,每发送一包音频数据到解码通道前,都必须先把这个数组中的内容组合到包的头部位置,否则解码出错。G711、G726、ADPCM编码协议的采样率均为8KHz。其中,Hi3518/Hi3516C 使用内部 audio codec。Hi3518A/Hi3516C 支持双声道,左右声道输入,左右声道输出。Hi3518C 只支持单声道,左声道输入、左声道输出。音频 AI 和 AO 支持的最大通道数为 16 通道(其中 Hi3518/Hi3516C 芯片受内置 codec 限制,只支持 2 通道),且配置 AI 和 AO 设备时需要将通道配置为偶数。 Hi3518/Hi3516C 只支持 16bit 位宽。Hi3518A/Hi3518C/Hi3516C 提供一个内置的 Audio Codec,并在芯片内部对接到 SIO0接口,即 SIO0 接口只能通过内置的 Audio Codec 完成声音的播放及录制。因为 AudioCodec 不能发送同步时钟,所以 SIO0 接口只能配置为 I2S 时序的主模式(MASTER)。用户需要正确配置 SIO0 和 Audio Codec 对接时序才可接收或发送音频数据。
为了分开验证Audio in 和audio out。实际上Mic in和speaker。
我写了一个int hisi_play(char codectype,char*datafile)程序,可以linux-ubuntu下面播放sample_audio录制的audio_stream.g711u文件。
要通过RTSP传输,还在解决一个关键问题:确定audio的PTS。
PTS其实很简单,就是timestamp(unit:ms) *90即可。
Audio的PTS如何与Video的PTS同步呢?需要同步吗?
从VLC的播放来看,不需要考虑与videoPTS的同步。
在播放时,总有一些咔嚓声。以为是PTS有问题,但最终查明是SDP不正确。PCMU,我用的是G.711 u-law。正确的SDP如下:
m=audio 0 RTP/AVP97
c=IN IP4 0.0.0.0
a=rtpmap:97PCMU/44100/2
a=control:track2
a=fmtp: 97streamtype=5;mode= g711u-law;config=0a10
终于,VLC可以接收到Hi3516C摄像机通过RTSP/RTP传送的video/audio并正常播放。