ESM6802是英創(chuàng)公司推出的基于Freescale i.MX6DL雙核處理器(ARM Cortex-A9,主頻1GHz)的高性能工控主板,imx6dl內(nèi)部包含一個(gè)視頻處理模塊(VPU)可以支持多種視頻格式的編解碼,而開發(fā)板預(yù)裝的Linux系統(tǒng)也提供了gstreamer以及Qt 5.8來給視頻處理應(yīng)用程序提供便捷的函數(shù)接口。本文將簡單介紹VPU硬件模塊以及gsteamer多媒體編程框架和Qt 5.8的多媒體處理模塊。
1、多媒體文件簡單介紹
多媒體文件通常有文件后綴如mp4、mkv等。這些后綴表明的是多媒體文件的container格式,也就是視頻數(shù)據(jù)、音頻數(shù)據(jù)、字幕數(shù)據(jù)的封裝在一個(gè)文件中的封裝格式。而視頻數(shù)據(jù)、音頻數(shù)據(jù)又有自己的編碼格式,如視頻常用的H264、MPEG4等以及音頻常用的AC3、MP3等。編碼格式才是不同多媒體文件之間的本質(zhì)區(qū)別所在,在處理相關(guān)多媒體文件時(shí)必須有相應(yīng)的編解碼器才能進(jìn)行。不同的編碼能夠提供不同的數(shù)據(jù)壓縮水平以及數(shù)據(jù)恢復(fù)的質(zhì)量,關(guān)于各種編碼標(biāo)準(zhǔn)以及文件封裝格式的詳細(xì)信息用戶可以自行查看相關(guān)資料,我們建議用戶在使用中盡量使用H264編碼的視頻數(shù)據(jù)。
2、硬件資源介紹
imx6dl內(nèi)部集成了一個(gè)高性能的、支持多種編解碼格式的視頻處理模塊(VPU),支持最高1920x1080 60i或者30p分辨率的解碼以及1920x1088分辨率的視頻編碼,使用VPU來處理視頻不占用CPU資源,而且處理速度更快,在實(shí)際使用中應(yīng)該盡量優(yōu)化應(yīng)用程序使用VPU來處理視頻編解碼相關(guān)操作。
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
關(guān)于支持的編解碼格式的詳細(xì)說明請(qǐng)參考后面Qt章節(jié)的詳細(xì)列表或者文檔《i.MX VPU Application Programming Interface Linux Reference Manual》,我們?cè)诖瞬辉僭敿?xì)說明。
VPU提供了一套函數(shù)接口供程序調(diào)用,程序調(diào)用這些API函數(shù)向VPU發(fā)送命令以及相應(yīng)的參數(shù)來達(dá)到控制VPU編解碼的運(yùn)行。由于Linux系統(tǒng)下面的視頻處理編程框架有更加高級(jí)的gstreamer,而且imx6dl也提供了相應(yīng)的gstreamer插件來使用VPU資源,我們不再詳細(xì)介紹VPU提供的低級(jí)API函數(shù),也不推薦用戶使用這套API,不過有興趣的用戶可以自行參考《i.MX VPU Application Programming Interface Linux Reference Manual》。
3、GStreamer介紹
GStreamer是目前常用的流媒體處理編程框架,GStreamer提供一種基于插件的編程框架,他的核心部分只提供了支持框架之間的數(shù)據(jù)流、媒體格式的協(xié)商等基礎(chǔ)功能,而對(duì)于流媒體的編解碼以及流媒體內(nèi)容的獲?。ㄈ鐢z像頭、網(wǎng)絡(luò)、本地文件)等功能都由插件提供。在編程時(shí)可以將插件進(jìn)行連接組合成一條流媒體處理流水線(pipeline),當(dāng)流水線工作時(shí),流媒體內(nèi)容從第一個(gè)插件元素(element)一直流動(dòng)到最后一個(gè),各個(gè)插件元素完成自己的功能從而實(shí)現(xiàn)流媒體的處理。一個(gè)簡單的ogg視頻播放流水線示例如下圖所示:
一個(gè)流水線內(nèi)的元素包含了數(shù)據(jù)處理接口(pad),pad根據(jù)數(shù)據(jù)的流向又分為source pad和sink pad,如上圖所示,source pad是生成數(shù)據(jù)的接口,而sink pad是接收數(shù)據(jù)的接口。每個(gè)接口都有自己能夠接收或產(chǎn)生的數(shù)據(jù)格式的限制,稱為cap capabilities,這些限制可以使用命令行工具gst-inspect-1.0進(jìn)行查看,使用方法為:
gst-inspect-1.0 [選項(xiàng)...] [ELEMENT-NAME | PLUGIN-NAME]
如查看v4l2src,v4l2src是用于從攝像頭采集數(shù)據(jù)的元素,命令輸出部分結(jié)果如下:
上圖中可以看到v4l2src有一個(gè)source pad,可以生成image/jpeg、video/mpeg、video/x-h264等格式的數(shù)據(jù),在構(gòu)建GStreamer流水線時(shí),只有當(dāng)兩個(gè)元素的src pad和sink pad能夠處理相同格式的數(shù)據(jù)時(shí),才能將這兩個(gè)元素連接起來。而對(duì)于像v4l2src這類的數(shù)據(jù)生成的元素,其支持的數(shù)據(jù)格式和最終能夠產(chǎn)生的數(shù)據(jù)格式是不一樣的,能夠產(chǎn)生的數(shù)據(jù)格式是所支持的數(shù)據(jù)格式的一部分,受到攝像頭硬件的限制,比如常見的USB攝像頭只支持生成YUY2\jpeg格式,則使用此攝像頭的v4l2src元素也就只能產(chǎn)生這兩中格式的數(shù)據(jù),在編程時(shí)要特別注意這點(diǎn),避免錯(cuò)誤的連接元素。
更多GStreamer基礎(chǔ)知識(shí)請(qǐng)用戶詳細(xì)閱讀GStreamer官網(wǎng)上的編程參考手冊(cè)或其他相關(guān)知識(shí),我們下面將介紹imx6dl所提供的特有的插件。
基于imx6dl內(nèi)部視頻處理模塊VPU的GStreamer插件包括:
●vpudec: 基于VPU的視頻解碼插件
●vpuenc_h264: 基于VPU的AVC/H264視頻編碼插件
●vpuenc_h263: 基于VPU的H263視頻編碼插件
●vpuenc_mpeg4: 基于VPU的MPEG4視頻編碼插件
●vpuenc_jpeg: 基于VPU的JPEG視頻編碼插件
上面模塊的編解碼格式詳細(xì)信息可以參考上一章VPU的介紹。
基于其他硬件模塊的插件包括:
●overlaysink: 基于2D圖形處理模塊G2D的視頻輸出插件
●imxvideoconvert_g2d: 基于G2D的視頻圖像轉(zhuǎn)換模塊,包括圖像顏色空間轉(zhuǎn)換、改變大小、旋轉(zhuǎn)
●imxvideoconvert_ipu: 基于圖像處理模塊ipu的圖像轉(zhuǎn)換模塊
●imxcompositor_g2d: 基于G2D的視頻編排模塊
●imxcompositor_ipu: 基于IPU的視頻編排模塊,視頻合成模塊可以將多個(gè)視頻編排成一個(gè),并且編排同時(shí)支持顏色空間轉(zhuǎn)換、改變大小、旋轉(zhuǎn)、alpha(透明度)、z-order(用于圖像重疊)。
這些插件在處理數(shù)據(jù)時(shí)都不會(huì)占用CPU資源,并且能提供高性能的數(shù)據(jù)處理,建議用戶在應(yīng)用程序中優(yōu)先使用這些插件。每個(gè)插件都有支持的數(shù)據(jù)格式限制,用戶可以使用gst-inspect-1.0命令進(jìn)行查看,限于篇幅我們只展示vpuenc_h264的部分輸出如下:
從輸出可知,vpuenc_h264支持video/x-raw格式的視頻輸入,而且限制為NV12、I420、YV12顏色模式,以及分辨率為寬64~1920、長64~1088,幀率從每秒0幀到每秒2147483647幀,如果要使用vpuenc_h264進(jìn)行視頻文件編碼,則前一級(jí)的GStreamer流水線元素必須提供限制內(nèi)的數(shù)據(jù)格式,否則將無法正確編碼,程序運(yùn)行出錯(cuò)。用戶在使用GStreamer插件之前需要先確認(rèn)其支持的數(shù)據(jù)格式以及之前插件提供的輸入的數(shù)據(jù)格式是否匹配,以免程序不能正常運(yùn)行。
除了單獨(dú)使用插件外,GStreamer還提供高級(jí)元素,元素內(nèi)部自動(dòng)識(shí)別文件格式調(diào)用相應(yīng)的插件來完成數(shù)據(jù)處理,比如playbin、decodebin、camerabin等,這些元素能夠自動(dòng)使用上面所說的特定硬件的插件。這些元素能夠簡化程序的開發(fā),但是程序也就不能詳細(xì)配置某個(gè)特定的插件的屬性了,程序少了靈活性,更多相關(guān)內(nèi)容請(qǐng)自行參考GStreamer相關(guān)文檔。
4、Qt 5.8多媒體處理模塊
ESM6802文件系統(tǒng)已經(jīng)移植了Qt 5.8,Qt的多媒體處理模塊是基于GStreamer框架搭建的,用戶在編寫程序時(shí)可以調(diào)用Qt提供的API來進(jìn)行視頻處理,這樣就可以在使用硬件資源(VPU、IPU、G2D等)的同時(shí)簡化程序的復(fù)雜程度(不用自行搭建GStreamer流水線)。
關(guān)于Qt視頻播放的介紹請(qǐng)參考我們官網(wǎng)的文章《ESM6802支持基于Qt的視頻播放》。
關(guān)于Qt攝像頭的程序請(qǐng)參考我們官網(wǎng)的文章《ESM6802支持Qt攝像頭應(yīng)用》。
由于Qt內(nèi)部多用playbin、camerabin等高級(jí)元素來構(gòu)建視頻應(yīng)用,應(yīng)用靈活性有限,為了使程序能正確運(yùn)行以及提高視頻數(shù)據(jù)處理性能,對(duì)輸入數(shù)據(jù)格式有一定限制。由之前兩章的介紹可知,imx6dl硬件資源能夠處理的多媒體格式是有限制的,在使用Qt進(jìn)行視頻播放時(shí)需要滿足這些限制才能正確的使用特定的硬件資源,而不占用CPU資源,對(duì)于視頻播放(解碼)的限制格式如下:
? 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
對(duì)于攝像頭應(yīng)用,支持的編碼輸出格式為:
? 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)
而要使用這些硬件編碼資源還需要攝像頭輸入數(shù)據(jù)滿足如下格式:
video/x-raw
format: { NV12, I420, YV12 }
width: [ 64, 1920, 8 ]
height: [ 64, 1088, 8 ]
framerate: [ 0/1, 2147483647/1 ]
如果不能滿足以上格式要求,Qt內(nèi)部調(diào)用的GStreamer高級(jí)元素有可能會(huì)選取軟件編解碼插件來進(jìn)行視頻的處理,這樣整個(gè)處理過程會(huì)占用大量的CPU資源,也有可能內(nèi)部協(xié)商出錯(cuò),不能正常處理視頻,因此用戶最好在編寫應(yīng)用時(shí)提供滿足上面介紹的格式的視頻數(shù)據(jù)。購買攝像頭時(shí)盡量選擇能夠直接輸出NV12、I420、YV12格式的攝像頭,其他格式則需要自己構(gòu)建GStreamer pipeline先進(jìn)行數(shù)據(jù)格式的轉(zhuǎn)換,Qt內(nèi)部使用的camerabin不能正確處理這些。
更多視頻處理相關(guān)的內(nèi)容請(qǐng)關(guān)注我們后續(xù)的文章。
-
Linux
+關(guān)注
關(guān)注
87文章
11342瀏覽量
210245 -
嵌入式主板
+關(guān)注
關(guān)注
7文章
6086瀏覽量
35549
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論