張正華,胡方來,蘇 波,吳 韜,龔曉亮
(1.揚州大學(xué)信息工程學(xué)院,江蘇揚州225127;2.揚州國脈通信發(fā)展有限責(zé)任公司,江蘇揚州225002;3.揚州市公安局交通巡邏警察支隊,江蘇揚州225007)
H.264由于其編碼的高復(fù)雜度從一開始就限制了它的應(yīng)用,隨著人們對編碼算法的改進,去除了對編碼效果有限但復(fù)雜度高的一些算法,使得H.264的視頻編解碼技術(shù)逐漸得到應(yīng)用,現(xiàn)在使用得最多的編碼器就是X264[1-3]。相對而言,解碼器的速度要快得多,目前流行的 H.264解碼器包括 JM Decoder、T264 Decoder、X264 Decoder、ffmpeg 和 Intel的IPP庫。JM decoder是H.264的官方源碼,也是校驗?zāi)P停С痔匦院玫菍嵱眯暂^差;T264是國內(nèi)的開源項目,只能解T264本身的碼流;X264本身沒有decoder,但包含解碼器的部分函數(shù)雛形;ffmpeg是包含各種音視頻標準的codec,支持的標準全而且解碼速度也很快;IPP用于在Intel的各種處理平臺上實現(xiàn)信號處理常用算法以及音視頻編解碼算法,實現(xiàn)算法速度較快[4-6]。所有的解碼器中,除了Intel的商用IPP庫外,以ffmpeg的解碼最快最穩(wěn)定,ffmpeg集合了多種音、視頻的編解碼協(xié)議,可完成MPEG4和H.264等協(xié)議的解碼?;诖瞬⒔Y(jié)合現(xiàn)有的圖像傳輸研究現(xiàn)狀,對視頻圖像在嵌入式終端上的解碼方式進行了研究。
基于ffmpeg的視頻解碼播放流程如圖1所示。
圖1 ffmpeg視頻解碼流程
打開一個視頻文件并從中得到流,首先就是初始化libavformat/libavcodec;接著調(diào)用 av_register_all()函數(shù)注冊庫中含有的所有可用的文件格式和編解碼器,這樣當打開文件時就能夠自動選擇相應(yīng)的文件格式和編解碼器;然后調(diào)av_open_input_file()函數(shù)讀取文件頭并將文件信息存儲到pFormatCtx結(jié)構(gòu)體中;調(diào)用av_find_stream_info()函數(shù)取出文件中的流信息;再調(diào)用 avcodec_find_decode r()函數(shù)用來尋找頻流的解碼器,并得到指向視頻流的上下文的指針;最后調(diào)用avcodec_open()函數(shù)用來打開解碼器。
經(jīng)過評測發(fā)現(xiàn),各種H.264解碼器中,速度最快的是intel IPP,但是由于其是商用軟件,而其他的各種解碼器都屬于開源項目,所以最適合的選擇就是解碼速度第二的ffmpeg,而且其速度完全可以滿足實時播放的要求。
由于ffplay是一個基于ffmpeg和開放源代碼的跨平臺多媒體開發(fā)庫(Simple DirectMedia Layer,SDL)的播放器,因此,如果想在嵌入式平臺上使用ffplay來播放視頻文件,需要加入 SDL的支持[7,8]。下面首先交叉編譯SDL,這里采用的版本為SDL-1.2.13,然后編譯 ffplay 和 ffmpeg。
①下載SDL安裝包,解壓縮并進入SDL所在目錄。
② 運行配置。鍵入“./configure--help”,由于ARM板資源有限,根據(jù)需要設(shè)置參數(shù),看情況改變prefix目錄和各種選項,配置中指定使用幀緩沖設(shè)備,使用arm-linux-gcc交叉編譯。本文中,使用的編譯選項如下:
③ make和 make install,make install之后便在prefix目錄下生成所需的動態(tài)庫和include頭文件等。下面使用SDL自帶的例程測試交叉編譯的SDL是否可以在ARM上使用,運行成功后會生成二進制應(yīng)用程序“testwin”,將交叉編譯好的SDL庫和例程通過nfs掛載到ARM板,運行屏幕上出現(xiàn)移動的“SDL”說明交叉編譯成功。具體的測試選項如下:
④下載ffmpeg安裝包,創(chuàng)建依賴環(huán)境,在編譯ffmpeg之前可以根據(jù)需要安裝相應(yīng)的codec和依賴包,ffmpeg的支持庫包括xvid、x264、mp3和3gp等,可以網(wǎng)上下載相應(yīng)的源碼進行安裝。
⑤交叉編譯。交叉編譯完成后,將會在目標目錄下生成目標平臺處理器格式的二進制可執(zhí)行文件ffplay和ffmpeg,將生成的ffplay和ffmpeg移植到開發(fā)板上,同時將生成的庫文件移植到ARM上Linux系統(tǒng)的根目錄lib下運行。具體的編譯選項如下:
以下為基于ffmpeg的H.264視頻解碼的部分代碼:
這里使用了 foreman、news、carphone和 highway四個視頻序列,編碼30幀,生成4個不同的H.264格式碼流,將生成的碼流分別在嵌入式平臺上和PC機上進行了測試,測試結(jié)果的對比如表1和表2所示。
表1 解碼后圖像質(zhì)量對比
表2 解碼時間對比
表1反映了4個視頻序列分別在嵌入式平臺和PC機上解碼后視頻圖像的質(zhì)量對比,從表中數(shù)據(jù)可以看出,圖像質(zhì)量相差不大,嵌入式平臺上的解碼效果與PC機上解碼效果相近。表2反映出2個平臺對同一視頻流解碼速度的對比,從表中數(shù)據(jù)可以看出,PC機的解碼速度稍快于嵌入式平臺,單純地從嵌入式平臺的解碼時間來看,其已經(jīng)能夠滿足工程應(yīng)用中的實時性要求。
為了能夠更鮮明地說明目標板的解碼效果,圖2和圖3給出了foraman視頻序列解碼前后的圖像對比效果。圖2是在目標板上用ffplay運行的帶誤碼的碼流效果,圖3給出了經(jīng)過ffmpeg解碼帶誤碼的碼流后的物理效果圖,從圖中可以得出,在嵌入式終端平臺上可以對視頻流進行實時的解碼處理,且能夠比較真實地反映源圖像的品質(zhì)。
圖2 運行帶誤碼的碼流
圖3 解碼后物理效果
在分析了各種解碼器的性能后選用了ffmpeg對H.264進行解碼。研究了ffmpeg的解碼流程和實現(xiàn)以及ffmpeg解碼 H.264的實現(xiàn),最后實現(xiàn)了ffmpeg和ffplay在嵌入式平臺上的移植并給出了實現(xiàn)圖。從實驗結(jié)果分析,研究是切實可行的。目前,智能交通行業(yè)的發(fā)展已經(jīng)迎來了新浪潮,智能監(jiān)控已成為智能交通行業(yè)車輛信息采集的主要方式[9],嵌入式系統(tǒng)在智能交通上的應(yīng)用已成可能,隨著技術(shù)的不斷深入,交通智能化必定會在各領(lǐng)域的共同努力下成為不可逆轉(zhuǎn)的趨勢。從實際運用看,上述研究可以依托視頻傳感器采集的圖像,利用現(xiàn)階段路口大范圍普及的視頻攝像頭,利用現(xiàn)有的資源獲取極大的效益,無需增加額外的成本。
[1]畢厚杰.新一代視頻壓縮編碼標準——H.264/AVC[M].北京:人民郵電出版社,2005:68-128.
[2]郭寶龍,倪 偉,閆允一.通信中的視頻信號處理[M].北京:電子工業(yè)出版社,2007:30-55.
[3]馬宇峰,魏 維,楊科利.視頻通信中的錯誤隱藏技術(shù)[M].北京:國防工業(yè)出版社,2007:44-58.
[4]WIEGAND T,SULLIVAN G J.Overview of the H.264/AVC Video Coding Standard[J].IEEE Transactions on Circuits and Systems for Video Technology,2003,13(7):560-576.
[5]SULLIVAN G J,TOPIWALA P,LUTHRA A.The H.264/AVC Advanced Video Coding Standard:Overview and Introduction to the Fidelity Range Extensions[C]∥SPIE Conference on Applications of Digital Image Processing,2004:376-382.
[6]IAIN E,RICHARDSON G.H.264 and MPEG -4 Video Compression[M].The RobertGordon University,Aberdeen,UK,2004:159 -187.
[7]周立功.ARM嵌入式系統(tǒng)基礎(chǔ)教程[M].北京:北京航空航天大學(xué)出版社,2005:415-449.
[8]何 勛,周 鷹,王亞非.基于S3C2440的H.264軟編解碼器實現(xiàn)[J].現(xiàn)代電子技術(shù),2010,38(6):38-39.
[9]王靜靜.面向智能交通的視頻車輛檢測、跟蹤和識別算法研究[D].山東:東北大學(xué),2009:12-16.