您的位置:首页 > 其它

海思hi3516C平台音频输入/输出调试过程

2015-10-16 00:54 323 查看
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/***P97

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并正常播放。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: