摘 要:
关键词:
中图分类号:TP302.1 文献标识码:A 文章编号:
FFmpeg是如今多媒体领域用途非常广泛的一个开源免费跨平台的视频和音频流方案,MP3格式是一种常用的音频格式。但是ffmpeg对MP3v2.5规格的MP3音频文件解码支持不是很好,在播放时会有明显失真,而MP3v2.5规格的MP3多应用与低码率、低采样率的语音通信。本文介绍了MP3文件格式,以及其解码流程,主要讨论了改进ffmpeg MP3解码器的方法,对ffmpeg MP3解码器进行优化。
中图分类号:TP801 文献标识码:A 文章编号:
1.FFmpeg介绍
FFmpeg是一个自由软件,可以执行音讯和视讯多种格式的录影、转档、串流功能,包含了libavcodec ---这是一个用于多个专案中音讯和视讯的解码器函式库,以及 libavformat ---一个音讯与视讯格式转换函式库:
"mpv2.5_mp3":MP3解码器的名称,注意要与解码器注册函数中相应参数保持一致;
CODEC_TYPE_AUDIO:说明解码器解码文件的类型,此处为MP3音频文件;
CODEC_ID_MP3v2.5:对应MP3解码器的唯一ID,是解码器的身份标识;
Decode_init_mp3:对应MP3解码器的初始化接口;
Decode_frame_mp3:对应MP3解码器的解码数据接口;
Decode_close_mp3:对应MP3解码器的析构接口。
(2)MP3解码库的接口API:
Android中的MP3解码库函数接口主要有以下接口:
void pvmp3_InitDecoder(tPVMP3DecoderExternal *pExt, void *pMem);
MP3解码库的初始化接口,负责解码库基本参数的初始化以及分配解码需要的buffer;
ERROR_CODE pvmp3_framedecoder(tPVMP3DecoderExternal *pExt, void *pMem);
MP3解码库的解码接口,负责解码输入的MP3数据,输出PCM数据;
3.2 主要步骤
(1)注册解码器:
在文件allcodecs.c中,实现所有ffmpeg支持格式的编解码器的注册,因此首先在此文件中实现添加MP3解码器的注册。
解码器注册函数为:
REGISTER_DECODER(MPV2.5_MP3,mpv2.5mp3);
此函数是一个宏定义,实际会调用函数:
void avcodec_register(AVCodec *codec);
(2)添加解码器的ID:
编解码器的ID为编解码器的身份标识,具有唯一性,在ffmpeg中,会根据ID来寻找对应的编解码器。
在文件avcodec.h中的enum CodecID中实现注册:
enum CodecID {
CODEC_ID_NONE,
/* video codecs */
CODEC_ID_MPEG1VIDEO,
CODEC_ID_MPEG2VIDEO,
…………
…………
/* audio codecs */
CODEC_ID_MP2= 0x15000,
CODEC_ID_MP3,
CODE
C_ID_MP3v2.5,
…………
};
(3)实现解码器到解码库的接口对应:
为新添加的MP3解码库实现一个封装,封装后接口为:
void* Decodeinit_mp3v2.5(void);
void Decoder_exit_mp3v2.5(void* state);
int Decode_frame_mp3v2.5(void *s,
signed short *samples,const uint8 *buf,
int buf_size,int *data_size) ;
其中state是一个封装层的结构体实现MP3解码器与解码库的数据交互,内容如下:
struct state_mp3{
tPVMP3DecoderExternal *mp3decoderdata;
unsigned char* pMem;
};
4.优化结果对比
为了较为直观的显示ffmpegMP3解码器优化前后的不同,本文中找到MPv2.5b版本的不同采样率的多个MP3文件测试,用变量信噪比(Signal to Noise Ratio)显示优化前后区别,如表1:
通过表格1我们可以看出,优化后ffmpeg解码MPv2.5版本的MP3文件信噪比明显提升,达到预期效果。
5.总结
本文介绍了多媒体编解码库ffmpeg,以及MP3文件格式,主要讨论了改进ffmpeg对mpv2.5 MP3音频文件的支持,实现对ffmpeg中MP3解码器的优化。优化后的ffmpeg MP3解码器可以清楚、流畅、无失真播放mpv2.5 MP3音频文件。
参考文献:
吴张顺. 基于ffmpeg的视频编码存储研究与实现,浙江:杭州电子科技大学,2006.