ffmpeg的ac3编码代码实现流程不难,基本都是一些固定的API调用,可自行查阅网上实例代
码。虽然网上的大都是aac编码示例,但基本大同小异,可举一反三。而如果是在嵌入式设备
平台上实现ac3编码的话,我们面临的更多是CPU性能优化问题和合理处理栈内存问题。
建议先实现pcm文件编程成ac3文件,这样会基本了解文件读取处理,一些编码参数配置,以
及编码封装处理流程。后续有需要的话自行改成实时流输出方案。
以下重点说明关键处理和遇到问题的解决方案。
一、单声道pcm数据构建双声道处理
这样处理转成的双声道数据,可能不是理想的立体声。
二、音频格式及重采样
旧ffmpeg版本的编码和解码接受的音频格式多数是S16(AV_SAMPLE_FMT_S16),是
PackedFormat格式,就是左右两个声道是连续排列的,而ffmpeg新版本引进了新的排列格
式AV_SAMPLE_FMT_S16P,AV_SAMPLE_FMT_FLTP,这些是PlaneFormat,左右声道是
分开两个平面存储的(跟图像将Y,U,V分量分开三个平面存储的方式相似),这样就使处理
流程变得复杂了,使原来的代码要改很多东西。
AV_SAMPLE_FMT_S16的存贮方式如下图:
AV_SAMPLE_FMT_FLTP的存储方式如下图:
/*填充pcm数据,由于海思只出单声道的数据,此处需构建为双声道的pcm数据*/
stPcmDataNode.size=2*u32Len;//大小扩大到2倍
stPcmDataNode.u64Pts=u64AudioPts;//记录pts
stPcmDataNode.data=malloc(2*u32Len);//大小扩大到2倍
for(u32II=0;u32II<u32Len;u32II+=2)//分两个通道填充pcm数据
{
memcpy((void*)(stPcmDataNode.data+2*u32II),(void
*)&u8data[u32II],2);
memcpy((void*)(stPcmDataNode.data+2*u32II+2),(void
*)&u8data[u32II],2);
}
1
2
3
4
5
6
7
8
9