《FFmpeg MP3解碼器的研究與優(yōu)化》由會員分享,可在線閱讀,更多相關(guān)《FFmpeg MP3解碼器的研究與優(yōu)化(3頁珍藏版)》請在裝配圖網(wǎng)上搜索。
1、FFmpeg MP3解碼器的研究與優(yōu)化
摘 要:
關(guān)鍵詞:
中圖分類號:TP302.1文獻標(biāo)識碼:A文章編號:FFmpeg是如今多媒體領(lǐng)域用途非常廣泛的一個開源免費跨平臺的視頻和音頻流方案,MP3格式是一種常用的音頻格式。但是ffmpeg對MP3v2.5規(guī)格的MP3音頻文件解碼支持不是很好,在播放時會有明顯失真,而MP3v2.5規(guī)格的MP3多應(yīng)用與低碼率、低采樣率的語音通信。本文介紹了MP3文件格式,以及其解碼流程,主要討論了改進ffmpeg MP3解碼器的方法,對ffmpeg MP3解碼器進行優(yōu)化。中圖分類號:TP801文獻標(biāo)識碼:A文章編號:1.FFmpeg介紹FFmpe
2、g是一個自由軟件,可以執(zhí)行音訊和視訊多種格式的錄影、轉(zhuǎn)檔、串流功能,包含了libavcodec ---這是一個用于多個專案中音訊和視訊的解碼器函式庫,以及 libavformat ---一個音訊與視訊格式轉(zhuǎn)換函式庫【1】。這個項目最初是由Fabrice Bellard發(fā)起的,而現(xiàn)在是由Michael Niedermayer在進行維護。許多FFmpeg的開發(fā)者同時也是MPlayer項目的成員,F(xiàn)Fmpeg在MPlayer項目中是FFmpeg包含了大部分主流格式的音視頻編解碼,以及格式間轉(zhuǎn)換,而且具有很好的可移植性,其主要由以下元件組成:(1)ffmpeg是一個命令列工具,用來對視訊檔案轉(zhuǎn)換格式,
3、也支援對電視卡即時編碼;(2)ffserver是一個 HTTP 多媒體即時廣播串流服務(wù)器,支援時光平移;(3)ffplay是一個簡單的播放器,基于 SDL 與 FFmpeg 函式庫;(4)4libavcodec包含了全部 FFmpeg 音訊/視訊 編解碼函式庫;(5)libavformat包含 demuxers 和 muxer 函式庫;(6)libavutil包含一些工具函式庫;(7)libpostproc對于視訊做前處理的函式庫;(8)libswscale對于影像作縮放的函式庫;FFmpeg結(jié)構(gòu)主要是muxer/demuxer負責(zé)文件的組成/解析,decoder/encoder負責(zé)文件的編解
4、碼,device負責(zé)音視頻的輸出,其解碼結(jié)構(gòu)圖如下:圖1 FFmpeg解碼結(jié)構(gòu)圖2. MP3文件格式解析及解碼流程2.1MP3文件格式解析Moving Picture Experts Group Audio Layer III(MPEG-1 Audio Layer 3,動態(tài)圖像專家壓縮標(biāo)準(zhǔn)音頻層面3),經(jīng)常稱為MP3,是當(dāng)今較流行的一種數(shù)字音頻編碼和有損壓縮格式,它設(shè)計用來大幅度地降低音頻數(shù)據(jù)量,而對于大多數(shù)用戶的聽覺感受來說,重放的音質(zhì)與最初的不壓縮音頻相比沒有明顯的下降。它是在1991年,由位于德國埃爾朗根的研究組織Fraunhofer-Gesellschaft的一組工程師發(fā)明和標(biāo)準(zhǔn)化的【
5、2】。聲音是一個模擬信號,對聲音進行采樣,量化,編碼就會得到PCM數(shù)據(jù),PCM數(shù)據(jù)也就是脈沖編碼調(diào)制音頻數(shù)據(jù),是電腦可以直接播放的原始數(shù)據(jù)。但是在PCM數(shù)據(jù)中含有很多對人類聽覺不重要的數(shù)據(jù),為了節(jié)省存儲空間同時還能保證很好的音效,MP3利用心理聲學(xué)技術(shù)將PCM音頻數(shù)據(jù)中人類不敏感的部分除去并壓縮形成MP3音頻文件。所以說MP3是一種有損壓縮格式【3】。MP3文件是由幀(Frame)構(gòu)成,幀是MP3文件的組成單位,其中每幀都有一個幀頭,長4個字節(jié),包含了MP3文件的版本,采樣率,比特率等屬性信息。MP3文件的版本及其對應(yīng)的采樣率如表格1所示:
表1 mp3文件版本及其對應(yīng)采樣率由上表可以看出,
6、MPv2.5對應(yīng)的采樣率較低,雖然其不是MPEG的標(biāo)準(zhǔn)規(guī)范,但是此版本的MP3文件在語音通話領(lǐng)域應(yīng)用較為廣泛,MP3解碼器有必要做好對應(yīng)的解碼。2.2MP3解碼流程MP3的解碼總體上可分為9個過程【4】:比特流分解,哈夫曼解碼,逆量化處理,立體聲處理,頻譜重排列,抗鋸齒處理,IMDCT變換,子帶合成,PCM輸出。比特流分解也就是將MP3文件以二進制方式打開,根據(jù)MP3格式的定義,依次從MP3文件中讀取頭信息,邊信息,比例因子等信息,這也就是demuxer所要做的工作。哈夫曼編碼是一種無損壓縮編碼,其解碼屬于decoder很重要的一部分。MP3音頻文件的詳細解碼流程如下圖二所示:圖2 MP3解碼
7、流程圖3.改進ffmpeg對MPv2.5的支持3.1 準(zhǔn)備工作MPv2.5雖然不屬于MPEG標(biāo)準(zhǔn),但是廣泛應(yīng)用于低采樣率的語音通信中,ffmpeg中的MP3解碼器,并沒有針對MPv2.5版本的decoder,本文在此另外添加一個decoder來解決失真的問題。谷歌的Android系統(tǒng)中的MP3解碼庫對MPv2.5有很好的支持,本文參考android的MP3解碼器新構(gòu)建一個MP3解碼器到ffmpeg中。3.1 準(zhǔn)備工作(1)FFmpeg中MP3解碼器格式:按照struct AVCodec的定義,本文添加的MP3解碼器格式如下:AVCodec mpv2.5_mp3_decoder ={"mpv2.
8、5_mp3",CODEC_TYPE_AUDIO,CODEC_ID_MP3v2.5,sizeof(MPADecodeContext),Decode_init_mp3,NULL,Decode_close_mp3,Decode_frame_mp3,CODEC_CAP_PARSE_ONLY,.flush= flush,.long_name= NULL_IF_CONFIG_SMALL("MP3 (MPEG audio layer 3)"),};其中各部分含義【5】:"mpv2.5_mp3":MP3解碼器的名稱,注意要與解碼器注冊函數(shù)中相應(yīng)參數(shù)保持一致;CODEC_TYPE_AUDIO:說明解碼器解碼文件
9、的類型,此處為MP3音頻文件;CODEC_ID_MP3v2.5:對應(yīng)MP3解碼器的唯一ID,是解碼器的身份標(biāo)識;Decode_init_mp3:對應(yīng)MP3解碼器的初始化接口;Decode_frame_mp3:對應(yīng)MP3解碼器的解碼數(shù)據(jù)接口;Decode_close_mp3:對應(yīng)MP3解碼器的析構(gòu)接口。
(2)MP3解碼庫的接口API:Android中的MP3解碼庫函數(shù)接口主要有以下接口:void pvmp3_InitDecoder(tPVMP3DecoderExternal *pExt, void *pMem);MP3解碼庫的初始化接口,負責(zé)解碼庫基本參數(shù)的初始化以及分配解碼需要的buffe
10、r;ERROR_CODE pvmp3_framedecoder(tPVMP3DecoderExternal *pExt, void *pMem);MP3解碼庫的解碼接口,負責(zé)解碼輸入的MP3數(shù)據(jù),輸出PCM數(shù)據(jù);3.2 主要步驟(1)注冊解碼器:在文件allcodecs.c中,實現(xiàn)所有ffmpeg支持格式的編解碼器的注冊,因此首先在此文件中實現(xiàn)添加MP3解碼器的注冊。解碼器注冊函數(shù)為:REGISTER_DECODER(MPV2.5_MP3,mpv2.5mp3);此函數(shù)是一個宏定義,實際會調(diào)用函數(shù):void avcodec_register(AVCodec *codec);(2)添加解碼器的ID
11、:編解碼器的ID為編解碼器的身份標(biāo)識,具有唯一性,在ffmpeg中,會根據(jù)ID來尋找對應(yīng)的編解碼器。在文件avcodec.h中的enum CodecID中實現(xiàn)注冊:enum CodecID {CODEC_ID_NONE,
/* video codecs */CODEC_ID_MPEG1VIDEO,CODEC_ID_MPEG2VIDEO,……………………/* audio codecs */CODEC_ID_MP2= 0x15000,CODEC_ID_MP3,CODEC_ID_MP3v2.5,…………};(3)實現(xiàn)解碼器到解碼庫的接口對應(yīng):為新添加的MP3解碼庫實現(xiàn)一個封裝,封裝后接口為:voi
12、d* 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是一個封裝層的結(jié)構(gòu)體實現(xiàn)MP3解碼器與解碼庫的數(shù)據(jù)交互,內(nèi)容如下:struct state_mp3{tPVMP3DecoderExternal *mp3decoderdata;unsigned char* pMem;};4.優(yōu)化結(jié)果對比為了較為直
13、觀的顯示ffmpegMP3解碼器優(yōu)化前后的不同,本文中找到MPv2.5b版本的不同采樣率的多個MP3文件測試,用變量信噪比(Signal to Noise Ratio)顯示優(yōu)化前后區(qū)別,如表1:通過表格1我們可以看出,優(yōu)化后ffmpeg解碼MPv2.5版本的MP3文件信噪比明顯提升,達到預(yù)期效果。5.總結(jié)本文介紹了多媒體編解碼庫ffmpeg,以及MP3文件格式,主要討論了改進ffmpeg對mpv2.5 MP3音頻文件的支持,實現(xiàn)對ffmpeg中MP3解碼器的優(yōu)化。優(yōu)化后的ffmpeg MP3解碼器可以清楚、流暢、無失真播放mpv2.5 MP3音頻文件。參考文獻:【1】Wikipedia: ht
14、tp://en.wikipedia.org/wiki/Ffmpeg【2】Cervera ,Teresa ,The effect of MPEG audio compression on multidimensional set of voice parameters ,Logopedics Phoniatrics Vocology ,2001.8 ,Vol.26,P.124.【3】林福宗. 多媒體技術(shù)基礎(chǔ),北京:清華大學(xué)出版社,2001.【4】張波. 嵌入式MP3解碼研究與優(yōu)化,上海:上海交通大學(xué),2009.【5】吳張順. 基于ffmpeg的視頻編碼存儲研究與實現(xiàn),浙江:杭州電子科技大學(xué),2006.