重慶郵電大學 微電子工程重點實驗室 王代成 徐 鵬 朱仁義
嵌入式高清視頻文件的硬解碼播放實現
重慶郵電大學 微電子工程重點實驗室 王代成 徐 鵬 朱仁義
現了H264視頻和AAC音頻合成的高清視頻文件在Linux嵌入式平臺的播放方法。采用FFmpeg解碼庫對文件進行格式封裝解碼,利用S5PV210處理器的MFC(Multi Format Codec)硬件編解碼模塊進行音視頻解碼,實現了Linux系統下的音視頻同步播放,同時降低了高清視頻文件播放時對CPU資源的占用率。
嵌入式;高清視頻;硬解碼;音視頻同步
高清視頻資源的日益豐富和用戶對移動高清視頻播放需求的增長,使得基于嵌入式的高清視頻播放終端的設計成為巨大的需求。
開源項目FFmpeg提供了一系列的多媒體視頻處理工具,但其包含的音頻/視頻解碼軟件庫在占用的CPU資源巨大,在低主頻的嵌入式終端中并不能良好運行,所以低主頻的嵌入式終端需要配合視頻硬件加速解碼。三星公司推出的多媒體應用處理器S5PV210采用ARM CortexTM-A8內核,內建MFC Multi Format Codec),支持MPEG-1/2/4、H.263、H.264等格式視頻的編解碼,非常適合應用于高清視頻終端。因此本文提出了一種基于FFmpeg與S5PV210處理器的硬解碼相結合的高清視頻文件播放方法。
1.1 整體設計
高清視頻文件播放的整體方案設計如圖1所示。

圖1 高清視頻播放的整體框圖
首先將高清視頻文件輸入至音視頻分離器,取出封裝中的音視頻幀并儲存于緩存中,為實現同步播放,這里定義一個結構體儲存幀數據和時間戳:
typedef struct av_frame {
double timeStamp;
unsigned int size;
unsigned char* data;
char frameType;
} av_frame;
其中timeStamp代表音視頻幀時間戳; size代表幀長;data代表幀數據指針frameType代表視頻幀類型(音頻幀保留)。
以上述結構作為節點建立音視頻緩存隊列,分別儲存音、視頻幀數據。
然后音視頻解碼器分別從音視頻隊列中取出幀數據進行音視頻解碼,再將音視頻數據根據時間戳進行音視頻同步播放。
1.2 文件封裝格式解碼
文件封裝格式解碼使用FFmpeg庫,FFmpeg庫功能十分強大,解碼步驟如下:
①初始化FFmpeg庫;
②打開本地高清視頻文件;
③讀出媒體文件信息,并使用串口輸出;
④讀取碼流中的音頻若干幀或者視頻一幀,按解碼時間戳dts順序存入緩存隊列中。然后重復步驟④直至碼流中所有數據幀讀取完畢;
⑤最后在程序結束時關閉文件。
1.3 視頻解碼
視頻解碼使用三星公司提供的MFC硬件解碼庫。解碼步驟如下:
①打開MFC設備,將設備的物理地址映射至虛擬地址;②使用獲取設備的虛擬地址,即視頻幀的輸入地址;③初始化MFC設備為H264解碼模式;
④從緩存隊列中取出視頻幀,解析視頻幀按將SEI、SPS、PPS、I組合,而P幀和B幀作為獨立輸入,使用MFC解碼函數進行解碼;
⑤獲取解碼后的數據;
⑥重復步驟④⑤不斷的進行數據解碼。
1.4 音頻解碼
音頻解碼使用開源的的FAAD解碼庫。解碼步驟如下:
①從緩存隊列中取出AAC音頻幀,解析AAC幀頭信息,打開FAAD解碼庫;②使用步驟①中解析出來的幀頭信息對FAAD解碼庫初始化;③從音頻幀中取出去掉幀頭的AAC數據,調用FAAD解碼庫函數進行解碼,然后獲取解碼后的數據;
④不斷的從緩存隊列中取出新的音頻幀,重復調用步驟③。
1.5 音視頻同步播放
Linux聲卡設備為阻塞性IO,只要用AAC幀頭信息中的參數設置,音頻就可以按固定速率進行播放,并阻塞輸入。因此本文采用視頻同步到音頻的方式進行音視頻同步。根據當前音視頻顯示時間戳pts動態調整每一幀視頻畫面播放的持續時間。
實驗采用天嵌E8開發板,該開發板采用S5PV210為處理器,內存512MB,主頻1GHz,操作系統為Linux。

圖3 高清視頻文件信息

圖4 高清視頻播放效果圖
整個程序編譯后代碼2.58MB。程序運行后,內存耗費140MB,CPU耗費14%。
程序運行后,視頻解碼流暢且音視頻播放同步,使用調試串口輸出的視頻文件信息如圖3所示。
由以上信息,可知視頻是分辨率1920*1080的1080p高清視頻。
播放效果如圖4所示。
提出了嵌入式高清視頻文件硬解碼播放方法,使用功能豐富的FFmpeg開源解碼庫進行文件格式封裝解碼,同時使用S5PV210處理器進行H264硬解碼,既支持了多格式的視頻文件封裝又降低了高清視頻播放時的對處理器資源的占用率。
[1]顧艷華,王闖.基于樹莓派的高清視頻播放器的設計與實現[J].科技視界,2015(29):30-30.
[2]楊富豪.高清視頻解碼技術研究[J].數字技術與應用,2016(5): 86-86.
[3]王國裕,羅子文,張紅升.基于Linux系統的DMB接收終端設計[J].數字技術與應用,2014(11):146-147.
[4]康維新.嵌入式Linux系統開發與應用[M].機械工業出版社,2011.