1). 簡介
Gstreamer多媒體開發(fā)框架是當前嵌入式Linux設備最為常用的多媒體應用處理平臺,關于Gstreamer開發(fā)框架的介紹請參考我們過往發(fā)表的其他相關文章,這里不再贅述而是直接展示使用C語言基于Gstreamer進行攝像頭處理的示例程序開發(fā)。
本文所演示的平臺來自于Toradex Aaplis iMX6D嵌入式平臺,這個平臺是基于NXP iMX6系列ARM處理器,支持雙核心Cortex-A9。
2). 準備
a). ApalisiMX6D ARM核心版配合ApalisIxora載板,連接調(diào)試串口到開發(fā)主機,具體操作方法可以參考這里。
b). Apalis iMX6D操作系統(tǒng)使用Toradex LinuxRelease V2.7b2,下載和更新方法請參考這里。
c). 連接一個USB Camera到Ixora載板X8靠上的USB接口,這里使用Logitech 720P攝像頭。
3). 配置Ubuntu開發(fā)主機
a). 安裝Toradex提供的交叉編譯SDK,可以基于OpenEmbedded環(huán)境自行編譯,也可以從這里下載我們已經(jīng)編譯好的進行測試使用,下載后執(zhí)行下面命令進行安裝,并根據(jù)提示設置安裝目錄。
--------------------
$ ./angstrom-glibc-x86_64-armv7at2hf-neon-v2016.12-toolchain.sh-S
--------------------
b). 本文使用Eclipse IDE進行開發(fā),請參考這里的文章說明在Eclipse配置基本的SDK交叉編譯相關設置。
c). 啟動Eclipse并創(chuàng)建Gstreamer新項目
./ 在啟動Eclipse之前,首先打開Terminal并執(zhí)行下面命令配置SDK,配置在Terminal關閉時候失效,下次使用要重新配置。
--------------------
$ source SDK Path/environment-setup-armv7at2hf-vfp-neon-angstrom-linux-gnueabi
--------------------
./ 然后在同一Terminal下啟動Eclipse IDE
./ 創(chuàng)建新的Cross GCC項目,這里為gstest
d). 設置Gstreamer編譯選項
./gstest –> Properties-> C/C++ Build -> Settings –> Tool Settings -> Cross GCC Compiler-> Miscellaneous -> Other flags 添加下面內(nèi)容
--------------------
`pkg-config --cflags gstreamer-1.0` -fPIC
--------------------
./ ./gstest –> Properties -> C/C++Build -> Settings –> Tool Settings -> Cross GCC Linker ->Miscellaneous -> Linker flags添加下面內(nèi)容
--------------------
`pkg-config --libs gstreamer-1.0 gobject-2.0 glib-2.0`
--------------------
4). C程序開發(fā)示例
a). 本文演示C程序main程序中主要實現(xiàn)三種Gstreamer應用示例,第一種是捕獲USB攝像頭輸入圖像并顯示在桌面上,第二種是捕獲USB攝像頭輸入圖像并進行H.264編碼后保存為MKV視頻文件,第三種是讀取上面第二種保存的視頻文件并播放顯示在桌面上面。
b). 程序完整代碼如下,分別說明如下:
https://github.com/simonqin09/gstest/blob/master/gstest.c
./ Main函數(shù)首先創(chuàng)建所需要使用的Elements和bus等,然后初始化gstreamer并創(chuàng)建main loop。
./ 然后通過程序輸入?yún)?shù)做三個選項,分別對應上面提到的三個子應用。
./ 應用1 - 捕獲USB攝像頭輸入圖像并顯示在桌面
// 首先在iMX6上面可以通過命令行先測試好要使用的pipeline,如下:
--------------------
$ gst-launch-1.0 imxv4l2src device=/dev/video3 ! 'video/x-raw,width=1280, height=720, format=(string)YUY2' ! videoconvert ! imxv4l2sink overlay-width=640 overlay-height=480
--------------------
// 然后按照上面測試的pipeline在程序中先創(chuàng)建pipeline,然后再分別調(diào)用”gst_element_factory_make”函數(shù)匹配實際使用的elements,最后創(chuàng)建pipeline message bus和monitor。
// 然后調(diào)用”gst_bin_add_many”函數(shù)將剛才生成的elements添加到pipeline中。
// 最后調(diào)用”gst_element_link_many”函數(shù)順序鏈接各個elements
./ 應用2 - 捕獲USB攝像頭輸入圖像并進行H.264編碼后保存為MKV視頻文件
// 首先同樣在iMX6上面通過命令行先測試好要使用的pipeline,如下:
--------------------
$ gst-launch-1.0 imxv4l2src device=/dev/video3 ! 'video/x-raw,width=1280, height=720, format=(string)YUY2' ! videoconvert ! vpuenc_h264 ! matroskamux ! filesink location=output.mkv
--------------------
// 后面的程序和上面應用1是類似的方法配置
./ 應用3 - 讀取上面第二種保存的視頻文件并播放顯示在桌面
// 首先同樣在iMX6上面通過命令行先測試好要使用的pipeline,如下:
--------------------
gst-launch-1.0 filesrc location=output.mkv typefind=true ! matroskademux ! vpudec ! imxv4l2sink overlay-width=640overlay-height=480
--------------------
// 后面的程序基本上和上面應用1是類似的方法配置,只是有一個元件需要注意,就是”matroskademux”,通過”gst-inspect”查看可以得知其sink pad是根據(jù)src數(shù)據(jù)情況動態(tài)產(chǎn)生的,這樣導致在上面測試piepeline的時候沒有問題,但是做C程序開發(fā)的時候就需要我們來處理這個事件,因此我們添加了”on_pad_added”函數(shù),并在main函數(shù)中調(diào)用”g_signal_connect”函數(shù)來動態(tài)鏈接pipeline中的demux元件和decoder元件。
./ main函數(shù)最后通過”gst_element_set_state”函數(shù)play pipeline,并通過” g_main_loop_run”函數(shù)開始循環(huán)。
c). 測試上述c程序代碼運行請見如下:
./ 應用1:
--------------------------------
root@apalis-imx6:~# ./gstest 1 /dev/video3
[ 3689.676941] ERROR: v4l2 capture: slave not found! V4L2_CID_HUE
[ 3689.682806] ERROR: v4l2 capture: slave not found! V4L2_CID_HUE
[ 3689.688697] ERROR: v4l2 capture: slave not found! V4L2_CID_HUE
====== IMXV4L2SRC: 4.1.4 build on Apr 102017 02:13:12. ======
====== IMXV4L2SINK: 4.1.4 build on Apr 102017 02:13:12. ======
display(/dev/fb0) resolution is (1920x1080).
Running
v4l2sink need allocate 3 buffers.
--------------------------------
顯示如下:
./ 應用2:
--------------------------------
root@apalis-imx6:~# ./gstest 2 /dev/video3 output.mkv
[ 9096.456753] ERROR: v4l2 capture: slave not found! V4L2_CID_HUE
[ 9096.462704] ERROR: v4l2 capture: slave not found! V4L2_CID_HUE
[ 9096.468553] ERROR: v4l2 capture: slave not found! V4L2_CID_HUE
====== IMXV4L2SRC: 4.1.4 build on Apr 102017 02:13:12. ======
[INFO] Product Info: i.MX6Q/D/S
====== VPUENC: 4.1.4 build on Apr 10 201702:13:17. ======
wrapper: 1.0.68 (VPUWRAPPER_ARM_LINUX Build on Apr 4 2017 17:47:13)
vpulib: 5.4.35
firmware: 3.1.1.46072
Running
[INFO] ringBufferEnable 0, chromaInterleave 1, mapType 0, linear2TiledEnable 0
--------------------------------
查看生成文件如下:
./ 應用3:
--------------------------------
root@apalis-imx6:~# ./gstest 3 output.mkv
[INFO] Product Info: i.MX6Q/D/S
====== IMXV4L2SINK: 4.1.4 build on Apr 102017 02:13:12. ======
display(/dev/fb0) resolution is (1920x1080).
[INFO] Product Info: i.MX6Q/D/S
====== VPUDEC: 4.1.4 build on Apr 10 201702:13:17. ======
wrapper: 1.0.68 (VPUWRAPPER_ARM_LINUX Build on Apr 4 2017 17:47:13)
vpulib: 5.4.35
firmware: 3.1.1.46072
Running
Dynamic pad created, linking demux/decoder
[INFO] bitstreamMode 1, chromaInterleave 1, mapType 0, tiled2LinearEnable 0
v4l2sink need allocate 3 buffers.
--------------------------------
顯示如下:
5). 總結(jié)
Gstreamer框架是非常強大的多媒體處理工具,本文只是做了一些簡單的應用示例,更多詳細說明和示例請參考其官方網(wǎng)站。