首页 > 代码库 > 音频解码相关总结

音频解码相关总结

最近1年一直在做音频播放器的相关工作。


关于音频播放器,主要是做以下2项工作:

1> demux,对文件进行解析,获取Packet数据

2> 对解码器进行性能优化(主要针对软解)


对于第一点, 常见的辅助工具是阅读FFMPEG相关代码。

个人一些工作效率上的体会:

第一步: 建议在PC上利用QT等GUI工具,做一个树形控件,显示所有的数据block, 

点击该块, 上面显示2进制值,下面显示相应字段的Offset, 值, 相关解释。


第二步,移植到目标平台

这里关键点是注意 Big-Endian还是Little Endian


对于性能优化, 最近2周在做苹果的ALAC和AIFF格式支持,有以下体会

1> 充分利用Cache, 主要优化手段是将数据分块处理, 一般来说4K-32K是个合理边界。

音频解码方面主要有2个Buffer池子, 一个是未解码的Packet队列, 一个是解码后的Sample队列。

Packet队列输入来自USB,硬盘,局域网, 互联网, 各自的速度和缓存大小均不同,需要结合实际做统计分析。

Sample队列输入来自解码器, 输出则是DSP芯片。对这块数据的处理主要集中在Endian转化上。

如果CPU支持SIMD,建议用汇编来优化数据打包。


2> 对解码优化来说, 主要是利用CLZ指令来优化。

对于MIPS平台来说, 搜Linux内核代码可以找到汇编版本的实现。

如果硬件不支持,可以参考libFLAC的查表法。也就是将32位分割为4个8位,然后查256位表。


总的来说, 音频解码来说,技术上其实没啥核心, 现在大家比拼的更多是数据源上。


音频解码相关总结