ESM6802是英創公司推出的基于Freescale i.MX6DL雙核處理器(ARM Cortex-A9,主頻1GHz)的高性能工控主板,imx6dl內部包含一個視頻處理模塊(VPU)可以支持多種視頻格式的編解碼,而開發板預裝的Linux系統也提供了gstreamer以及Qt 5.8來給視頻處理應用程序提供便捷的函數接口。本文將簡單介紹VPU硬件模塊以及gsteamer多媒體編程框架和Qt 5.8的多媒體處理模塊。
1、多媒體文件簡單介紹
多媒體文件通常有文件后綴如mp4、mkv等。這些后綴表明的是多媒體文件的container格式,也就是視頻數據、音頻數據、字幕數據的封裝在一個文件中的封裝格式。而視頻數據、音頻數據又有自己的編碼格式,如視頻常用的H264、MPEG4等以及音頻常用的AC3、MP3等。編碼格式才是不同多媒體文件之間的本質區別所在,在處理相關多媒體文件時必須有相應的編解碼器才能進行。不同的編碼能夠提供不同的數據壓縮水平以及數據恢復的質量,關于各種編碼標準以及文件封裝格式的詳細信息用戶可以自行查看相關資料,我們建議用戶在使用中盡量使用H264編碼的視頻數據。
2、硬件資源介紹
imx6dl內部集成了一個高性能的、支持多種編解碼格式的視頻處理模塊(VPU),支持最高1920x1080 60i或者30p分辨率的解碼以及1920x1088分辨率的視頻編碼,使用VPU來處理視頻不占用CPU資源,而且處理速度更快,在實際使用中應該盡量優化應用程序使用VPU來處理視頻編解碼相關操作。
VPU能夠解碼的視頻格式為:
● H.264 BP/MP/HP
● VC-1 SP/MP/AP
● MPEG-4 SP/ASP (不包括GMC)
● DivX(Xvid)
● MPEG-1/2
● VP8
● AVS
● MJPEG
VPU支持的編碼格式為:
● H.264
● MPEG-4
● H.263
● MJPG
關于支持的編解碼格式的詳細說明請參考后面Qt章節的詳細列表或者文檔《i.MX VPU Application Programming Interface Linux Reference Manual》,我們在此不再詳細說明。
VPU提供了一套函數接口供程序調用,程序調用這些API函數向VPU發送命令以及相應的參數來達到控制VPU編解碼的運行。由于Linux系統下面的視頻處理編程框架有更加高級的gstreamer,而且imx6dl也提供了相應的gstreamer插件來使用VPU資源,我們不再詳細介紹VPU提供的低級API函數,也不推薦用戶使用這套API,不過有興趣的用戶可以自行參考《i.MX VPU Application Programming Interface Linux Reference Manual》。
3、GStreamer介紹
GStreamer是目前常用的流媒體處理編程框架,GStreamer提供一種基于插件的編程框架,他的核心部分只提供了支持框架之間的數據流、媒體格式的協商等基礎功能,而對于流媒體的編解碼以及流媒體內容的獲取(如攝像頭、網絡、本地文件)等功能都由插件提供。在編程時可以將插件進行連接組合成一條流媒體處理流水線(pipeline),當流水線工作時,流媒體內容從第一個插件元素(element)一直流動到最后一個,各個插件元素完成自己的功能從而實現流媒體的處理。一個簡單的ogg視頻播放流水線示例如下圖所示:
一個流水線內的元素包含了數據處理接口(pad),pad根據數據的流向又分為source pad和sink pad,如上圖所示,source pad是生成數據的接口,而sink pad是接收數據的接口。每個接口都有自己能夠接收或產生的數據格式的限制,稱為cap capabilities,這些限制可以使用命令行工具gst-inspect-1.0進行查看,使用方法為:
gst-inspect-1.0 [選項...] [ELEMENT-NAME | PLUGIN-NAME]
如查看v4l2src,v4l2src是用于從攝像頭采集數據的元素,命令輸出部分結果如下:
上圖中可以看到v4l2src有一個source pad,可以生成image/jpeg、video/mpeg、video/x-h264等格式的數據,在構建GStreamer流水線時,只有當兩個元素的src pad和sink pad能夠處理相同格式的數據時,才能將這兩個元素連接起來。而對于像v4l2src這類的數據生成的元素,其支持的數據格式和最終能夠產生的數據格式是不一樣的,能夠產生的數據格式是所支持的數據格式的一部分,受到攝像頭硬件的限制,比如常見的USB攝像頭只支持生成YUY2\jpeg格式,則使用此攝像頭的v4l2src元素也就只能產生這兩中格式的數據,在編程時要特別注意這點,避免錯誤的連接元素。
更多GStreamer基礎知識請用戶詳細閱讀GStreamer官網上的編程參考手冊或其他相關知識,我們下面將介紹imx6dl所提供的特有的插件。
基于imx6dl內部視頻處理模塊VPU的GStreamer插件包括:
● vpudec: 基于VPU的視頻解碼插件
● vpuenc_h264: 基于VPU的AVC/H264視頻編碼插件
● vpuenc_h263: 基于VPU的H263視頻編碼插件
● vpuenc_mpeg4: 基于VPU的MPEG4視頻編碼插件
● vpuenc_jpeg: 基于VPU的JPEG視頻編碼插件
上面模塊的編解碼格式詳細信息可以參考上一章VPU的介紹。
基于其他硬件模塊的插件包括:
● overlaysink: 基于2D圖形處理模塊G2D的視頻輸出插件
● imxvideoconvert_g2d: 基于G2D的視頻圖像轉換模塊,包括圖像顏色空間轉換、改變大小、旋轉
● imxvideoconvert_ipu: 基于圖像處理模塊ipu的圖像轉換模塊
● imxcompositor_g2d: 基于G2D的視頻編排模塊
● imxcompositor_ipu: 基于IPU的視頻編排模塊,視頻合成模塊可以將多個視頻編排成一個,并且編排同時支持顏色空間轉換、改變大小、旋轉、alpha(透明度)、z-order(用于圖像重疊)。
這些插件在處理數據時都不會占用CPU資源,并且能提供高性能的數據處理,建議用戶在應用程序中優先使用這些插件。每個插件都有支持的數據格式限制,用戶可以使用gst-inspect-1.0命令進行查看,限于篇幅我們只展示vpuenc_h264的部分輸出如下:
從輸出可知,vpuenc_h264支持video/x-raw格式的視頻輸入,而且限制為NV12、I420、YV12顏色模式,以及分辨率為寬64~1920、長64~1088,幀率從每秒0幀到每秒2147483647幀,如果要使用vpuenc_h264進行視頻文件編碼,則前一級的GStreamer流水線元素必須提供限制內的數據格式,否則將無法正確編碼,程序運行出錯。用戶在使用GStreamer插件之前需要先確認其支持的數據格式以及之前插件提供的輸入的數據格式是否匹配,以免程序不能正常運行。
除了單獨使用插件外,GStreamer還提供高級元素,元素內部自動識別文件格式調用相應的插件來完成數據處理,比如playbin、decodebin、camerabin等,這些元素能夠自動使用上面所說的特定硬件的插件。這些元素能夠簡化程序的開發,但是程序也就不能詳細配置某個特定的插件的屬性了,程序少了靈活性,更多相關內容請自行參考GStreamer相關文檔。
4、Qt 5.8多媒體處理模塊
ESM6802文件系統已經移植了Qt 5.8,Qt的多媒體處理模塊是基于GStreamer框架搭建的,用戶在編寫程序時可以調用Qt提供的API來進行視頻處理,這樣就可以在使用硬件資源(VPU、IPU、G2D等)的同時簡化程序的復雜程度(不用自行搭建GStreamer流水線)。
關于Qt視頻播放的介紹請參考我們官網的文章《ESM6802支持基于Qt的視頻播放》。
關于Qt攝像頭的程序請參考我們官網的文章《ESM6802支持Qt攝像頭應用》。
由于Qt內部多用playbin、camerabin等高級元素來構建視頻應用,應用靈活性有限,為了使程序能正確運行以及提高視頻數據處理性能,對輸入數據格式有一定限制。由之前兩章的介紹可知,imx6dl硬件資源能夠處理的多媒體格式是有限制的,在使用Qt進行視頻播放時需要滿足這些限制才能正確的使用特定的硬件資源,而不占用CPU資源,對于視頻播放(解碼)的限制格式如下:
? H.264
? Fully compatible with the ITU-T Recommendation H.264 specification in BP/MP and HP
? CABAC/CAVLC
? Supports MVC Stereo High profile
? Variable block size-16x16, 16x8, 8x16, 8x8, 8x4, 4x8 and 4x4
? Error detection, concealment and error resilience tools
? VC1
? All VC-1 profile features-SMPTE Proposed SMPTE Standard for Television: VC-1 Compressed Video Bitstream format and Decoding Process
? Simple/Main/Advanced Profile
? MPEG-4
? Simple/Advanced Simple profile except GMC
? H.263 Baseline profile + Annex I, J, K (except RS/ASO), and T
? DivX version 3.x to 6.x
? Xvid
? MPEG-2
? Fully compatible with ISO/IEC 13182-2 MPEG2 specification in main profile
? I,P and B frame
? Field coded picture (interlaced) and fame coded picture
? AVS
? Supports Jizhun profile level 6.2 (exclude 422 use case)
? VP8
? Fully compatible with VP8 decoder specification
? Supporting both simple and normal in-loop deblocking
? 64x64 pixel minimum decoding size
對于攝像頭應用,支持的編碼輸出格式為:
? H.264
? 1/4-pel accuracy motion estimation with programmable search range up to [+/-128, +/-64]
? Search range is reconfigurable by SW
? 16x16, 16x8, 8x16 and 8x8 block sizes
? Configurable block sizes
? Only one reference frame for motion estimation
? Intra-prediction
? Luma I4x4 Mode : 9 modes
? Luma I16x16 Mode : 3 modes (Vertical, Horizon, DC)
? Chroma Mode : 3 modes (Vertical, Horizon, DC)
? Minimum encoding image size is 96 pixels in horizontal and 16 pixels in vertical
? FMO/ASO tool of H.264 is not supported
? MPEG-4
? AC/DC prediction
? 1/2-pel accuracy motion estimation with search range up to [+/-128, +/-64]
? Search range is reconfigurable by SW
? H.263
? H.263 Baseline profile + Annex J, K (RS=0 and ASO=0), and T
? 48x32 pixel minimum encoding image size (48 pixels horizontal and 32 pixels vertical)
而要使用這些硬件編碼資源還需要攝像頭輸入數據滿足如下格式:
video/x-raw
format: { NV12, I420, YV12 }
width: [ 64, 1920, 8 ]
height: [ 64, 1088, 8 ]
framerate: [ 0/1, 2147483647/1 ]
如果不能滿足以上格式要求,Qt內部調用的GStreamer高級元素有可能會選取軟件編解碼插件來進行視頻的處理,這樣整個處理過程會占用大量的CPU資源,也有可能內部協商出錯,不能正常處理視頻,因此用戶最好在編寫應用時提供滿足上面介紹的格式的視頻數據。購買攝像頭時盡量選擇能夠直接輸出NV12、I420、YV12格式的攝像頭,其他格式則需要自己構建GStreamer pipeline先進行數據格式的轉換,Qt內部使用的camerabin不能正確處理這些。
更多視頻處理相關的內容請關注我們后續的文章。
成都英創信息技術有限公司 028-8618 0660