昵称:海鱼1001 日期:2014年10月25日—2014年10月31日
1.本周已完成任务:音频录制的噪声抑制。PCM+H264封装MP4,上周为音频为G711A,且参数不对合成不理想。
2.本周未完成任务:时间戳问题
3.下周计划:查找时间戳相关文献
4.关键技术点说明:
平台:linux HI3515
交叉编译器:arm-hisiv100nptl-linux
这周音频录制的噪声抑制是采用Hi3515自带的音频录制源码进行改进的。原来录制音频时,没有音频输入照样有较大的杂音,于是在文档中查找音频抑制的方法。发现一个自带函数“HI_MPI_AI_EnableAnr”
[语法]
HI_S32 HI_MPI_AI_EnableAnr(AUDIO_DEV AudioDevId, AI_CHN AiChn);
在源码中查找发现了一段关于这个函数的调用:
HI_S32 SAMPLE_COMM_AUDIO_StartAi(AUDIO_DEV AiDevId, HI_S32 s32AiChnCnt,AIO_ATTR_S *pstAioAttr, HI_BOOL bAnrEn, AUDIO_RESAMPLE_ATTR_S *pstAiReSmpAttr)
{
if (HI_TRUE == bAnrEn)
{
if (HI_MPI_AI_EnableAnr(AiDevId, i))
{
printf("%s: HI_MPI_AI_EnableAnr(%d,%d) failed with %#x\n", __FUNCTION__,\
AiDevId, i, s32Ret);
return HI_FAILURE;
}
}
}
而bAnrEn参数是函数的输入参数,所以找到这个函数的调用就可以开启AI噪声抑制。
最终找到了调用的地方s32Ret = SAMPLE_COMM_AUDIO_StartAi(AiDev, s32AiChnCnt, pstAioAttr, gs_bAiAnr, gs_pstAiReSmpAttr);
也就是gs_bAiAnr决定了是否开启噪声抑制。继续查找
static HI_BOOL gs_bAiAnr = HI_FALSE;
发现是没有开启,于是果断改成gs_bAiAnr = HI_TRUE;
编译之后运行,录音,却提示错误。
HI_MPI_AI_EnableAnr [Line]:971 [Info]:AiDev: 0, anr should be 80 or 160 poin
翻译后是:ANR应该是80或每FRM160点
找找代码发现
#define SAMPLE_AUDIO_PTNUMPERFRM 320
stAioAttr.u32PtNumPerFrm = SAMPLE_AUDIO_PTNUMPERFRM;
也就是代码中将每帧音频的长度定位了320,于是改成160试试,运行,可以正常录音了。
当然因为合成MP4的程序是也是用320的,那也要改成160,生成的MP4和原来没有去噪的对比,虽然还是有一点点的噪声,但明显小了很多。
(需要录音部分的源码可以在我的下载频道中下载)http://download.youkuaiyun.com/detail/sbadhwm/8106601
PCM+H264封装MP4的程序源码是引用http://blog.youkuaiyun.com/skdkjzz/article/details/40393891这篇文章,只要将G711A转PCM的部分去掉就行
其中main函数中
while(((gBytesRead = fread(pbG711ABuffer, 1, 164, joseph_aac_config->fpIn)) >0) && (nVideoRet < 312))改为:
while(((nPCMRead = fread(pbPCMTmpBuffer, 1, 160, joseph_aac_config->fpIn)) >0) && (nVideoRet < 312))
- pPCM = pbG711ABuffer + 4;
- memset(pbPCMTmpBuffer, 0, PCMSize);
- memset(joseph_aac_config->pbAACBuffer, 0, joseph_aac_config->nMaxOutputBytes);
- /*g711 to pcm*/
- if((nPCMRead = g711a_decode(pbPCMTmpBuffer, &PCMSize, pPCM, gBytesRead-4)) < 0)
- {
- printf(" G711A -> PCM fail\n");
- break;
- }
if(nPCMRead < 320)改成if(nPCMRead < 160)
再删除前面不需要用到的数组,函数,和定义。编译运行即可。
相应的程序就不发了,因为是别人那拿来改改的,要的自己去大神那下载。