您的位置:首页 > 其它

ffmpegMP3音频格式解码的优化

2011-03-14 10:27 381 查看
1 介绍
ffmpeg是如今多媒体领域用途非常广泛的一个开源免费跨平台的视频和音频流方案,MP3格式是一种常用的音频格式。但是ffmpeg对低码率,低采样率的MP3音频解码不能做到最好,在播放时会有明显失真,本文主要讨论失真的原因,以及解决的方法,对ffmpeg MP3 decoder进行优化。
2 ffmepg介绍
FFmpeg是一个自由软件,可以执行音讯和视讯多种格式的录影、转档、串流功能[1],包含了libavcodec ─这是一个用于多个专案中音讯和视讯的解码器函式库,以及 libavformat ——一个音讯与视讯格式转换函式库。这个项目最初是由Fabrice Bellard发起的,而现在是由Michael Niedermayer在进行维护。许多FFmpeg的开发者同时也是MPlayer项目的成员,FFmpeg在MPlayer项目中是被设计为服务器版本进行开发。
ffmpeg包含了大部分主流格式的音视频编解码,以及格式间转换,而且具有很好的可移植性,其主要由以下元件组成:
ffmpeg 是一个命令列工具,用来对视讯档案转换格式,也支援对电视卡即时编码
ffserver 是一个 HTTP 多媒体即时广播串流服务器,支援时光平移
ffplay 是一个简单的播放器,基于 SDL 与 FFmpeg 函式库
libavcodec 包含了全部 FFmpeg 音讯/视讯 编解码函式库
libavformat 包含 demuxers 和 muxer 函式库
libavutil 包含一些工具函式库
libpostproc 对于视讯做前处理的函式库
libswscale 对于影像作缩放的函式库
ffmpeg结构主要是muxer/demuxer负责文件的组成/解析,decoder/encoder负责文件的编解码, device负责音视频的输出,其结构图如下:
3 MP3文件格式介绍
8khz的MP3文件在语音通话领域应用比较多,MP3解码器有必要做好对应的解码。
4 MP3解码流程
4.1. 解码流程 Decode flow:
   MP3 Stream -> Sync Read Header    -> Decode Side Info   -> Decode Scale Factors
   MP3 比特流    同步并读取帧头         解码边信息            解码比例系数
              -> Decode Huffman Data -> Requantization     -> Stereo Process
                 解码哈夫曼数据         重新量化              立体声处理
              -> Alias Reduction     -> IMDCT Transform    -> IDCT Filterbank
                 剔除伪信号             逆离散余弦变换        逆离散余弦变换过滤
              -> Windowing           -> PCM Samples
                 窗口化                 转化为 PCM 采样
4.2. MP3 解码流程的九个阶段 MP3 decoding can be divided into 9 stages:
   同步                 Synchronization
     找到帧的开始位置、检查错误(CRC)
   霍夫曼解码           Huffman decoding
     解包信息,并输出量化的频率信息
   再量化               Requantize
     用比例系数放大输出信息
   再排序               Reorder
     增加频率后重新排序频率线
   立体声合成           Stereo decoding
     从结合的信号中解码左右声道
     为了更高的压缩比,双声道一起编码;
     立体声解码模块重新构造左右声道:
       Li = (Mi + Si) / Sqrt(2)
       Ri = (Mi - Si) / Sqrt(2)
   假象重构             Alias reconstruction
     假象重构就是使用蝴蝶结构结合相临子带以避免在域变换(IMDCT)中的锯齿效应。
   逆修饰离散傅立叶变换 IMDCT
     IMDCT 变换的目的就是将每个子带从频域转换到时域。
   频率倒置             Frequency inversion
   子带合成             Subband synthesis
http://wenku.baidu.com/view/57fb5506eff9aef8941e06c9.html
5 失真产生的原因
 
6 解决的方法
6.1 优化ffmpeg的MP3 decoder
6.2 添加针对8khz的MP3 decoder
低采样率的MP3文件常见于mpv2.5,其并不属于MPEG标准,ffmpeg中的MP3解码器,并没有针对MPv2.5版本的decoder,因此我们可以另外添加一个decoder来解决失真的问题。
首先,在文件allcodecs.c中添加相应decoder的注册函数,如下:
REGISTER_DECODER(MP3_LOW,mp3_low);
此函数实现新添加decoder的注册,
7总结
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: