《電子技術(shù)應(yīng)用》
您所在的位置:首頁(yè) > 模擬設(shè)計(jì) > 業(yè)界動(dòng)態(tài) > 嵌入式Linux下Gstreamer編程示例

嵌入式Linux下Gstreamer編程示例

2017-08-03
關(guān)鍵詞: Linux下Gstreamer ARM

  1). 簡(jiǎn)介

  Gstreamer多媒體開(kāi)發(fā)框架是當(dāng)前嵌入式Linux設(shè)備最為常用的多媒體應(yīng)用處理平臺(tái),關(guān)于Gstreamer開(kāi)發(fā)框架的介紹請(qǐng)參考我們過(guò)往發(fā)表的其他相關(guān)文章,這里不再贅述而是直接展示使用C語(yǔ)言基于Gstreamer進(jìn)行攝像頭處理的示例程序開(kāi)發(fā)。

  本文所演示的平臺(tái)來(lái)自于Toradex Aaplis iMX6D嵌入式平臺(tái),這個(gè)平臺(tái)是基于NXP iMX6系列ARM處理器,支持雙核心Cortex-A9。

  2). 準(zhǔn)備

  a). ApalisiMX6D ARM核心版配合ApalisIxora載板,連接調(diào)試串口到開(kāi)發(fā)主機(jī),具體操作方法可以參考這里。

  b). Apalis iMX6D操作系統(tǒng)使用Toradex LinuxRelease V2.7b2,下載和更新方法請(qǐng)參考這里。

  c). 連接一個(gè)USB Camera到Ixora載板X(qián)8靠上的USB接口,這里使用Logitech 720P攝像頭。

  3). 配置Ubuntu開(kāi)發(fā)主機(jī)

  a). 安裝Toradex提供的交叉編譯SDK,可以基于OpenEmbedded環(huán)境自行編譯,也可以從這里下載我們已經(jīng)編譯好的進(jìn)行測(cè)試使用,下載后執(zhí)行下面命令進(jìn)行安裝,并根據(jù)提示設(shè)置安裝目錄。

  --------------------

  $ ./angstrom-glibc-x86_64-armv7at2hf-neon-v2016.12-toolchain.sh-S

  --------------------

  b). 本文使用Eclipse IDE進(jìn)行開(kāi)發(fā),請(qǐng)參考這里的文章說(shuō)明在Eclipse配置基本的SDK交叉編譯相關(guān)設(shè)置。

  c). 啟動(dòng)Eclipse并創(chuàng)建Gstreamer新項(xiàng)目

  ./ 在啟動(dòng)Eclipse之前,首先打開(kāi)Terminal并執(zhí)行下面命令配置SDK,配置在Terminal關(guān)閉時(shí)候失效,下次使用要重新配置。

  --------------------

  $ source SDK Path/environment-setup-armv7at2hf-vfp-neon-angstrom-linux-gnueabi

  --------------------

  ./ 然后在同一Terminal下啟動(dòng)Eclipse IDE

  ./ 創(chuàng)建新的Cross GCC項(xiàng)目,這里為gstest

  d). 設(shè)置Gstreamer編譯選項(xiàng)

  ./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程序開(kāi)發(fā)示例

  a). 本文演示C程序main程序中主要實(shí)現(xiàn)三種Gstreamer應(yīng)用示例,第一種是捕獲USB攝像頭輸入圖像并顯示在桌面上,第二種是捕獲USB攝像頭輸入圖像并進(jìn)行H.264編碼后保存為MKV視頻文件,第三種是讀取上面第二種保存的視頻文件并播放顯示在桌面上面。

  b). 程序完整代碼如下,分別說(shuō)明如下:

  https://github.com/simonqin09/gstest/blob/master/gstest.c

  ./ Main函數(shù)首先創(chuàng)建所需要使用的Elements和bus等,然后初始化gstreamer并創(chuàng)建main loop。

  ./ 然后通過(guò)程序輸入?yún)?shù)做三個(gè)選項(xiàng),分別對(duì)應(yīng)上面提到的三個(gè)子應(yīng)用。

  ./ 應(yīng)用1 - 捕獲USB攝像頭輸入圖像并顯示在桌面

  // 首先在iMX6上面可以通過(guò)命令行先測(cè)試好要使用的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

  --------------------

  // 然后按照上面測(cè)試的pipeline在程序中先創(chuàng)建pipeline,然后再分別調(diào)用”gst_element_factory_make”函數(shù)匹配實(shí)際使用的elements,最后創(chuàng)建pipeline message bus和monitor。

  // 然后調(diào)用”gst_bin_add_many”函數(shù)將剛才生成的elements添加到pipeline中。

  // 最后調(diào)用”gst_element_link_many”函數(shù)順序鏈接各個(gè)elements

  ./ 應(yīng)用2 - 捕獲USB攝像頭輸入圖像并進(jìn)行H.264編碼后保存為MKV視頻文件

  // 首先同樣在iMX6上面通過(guò)命令行先測(cè)試好要使用的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

  --------------------

  // 后面的程序和上面應(yīng)用1是類似的方法配置

  ./ 應(yīng)用3 - 讀取上面第二種保存的視頻文件并播放顯示在桌面

  // 首先同樣在iMX6上面通過(guò)命令行先測(cè)試好要使用的pipeline,如下:

  --------------------

  gst-launch-1.0 filesrc location=output.mkv typefind=true ! matroskademux ! vpudec ! imxv4l2sink overlay-width=640overlay-height=480

  --------------------

  // 后面的程序基本上和上面應(yīng)用1是類似的方法配置,只是有一個(gè)元件需要注意,就是”matroskademux”,通過(guò)”gst-inspect”查看可以得知其sink pad是根據(jù)src數(shù)據(jù)情況動(dòng)態(tài)產(chǎn)生的,這樣導(dǎo)致在上面測(cè)試piepeline的時(shí)候沒(méi)有問(wèn)題,但是做C程序開(kāi)發(fā)的時(shí)候就需要我們來(lái)處理這個(gè)事件,因此我們添加了”on_pad_added”函數(shù),并在main函數(shù)中調(diào)用”g_signal_connect”函數(shù)來(lái)動(dòng)態(tài)鏈接pipeline中的demux元件和decoder元件。

  ./ main函數(shù)最后通過(guò)”gst_element_set_state”函數(shù)play pipeline,并通過(guò)” g_main_loop_run”函數(shù)開(kāi)始循環(huán)。

  c). 測(cè)試上述c程序代碼運(yùn)行請(qǐng)見(jiàn)如下:

  ./ 應(yīng)用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.

  --------------------------------

  顯示如下:

35acab90a6966dec6207314dc921c555.png

  ./ 應(yīng)用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

  --------------------------------

  查看生成文件如下:

89d3669113750692ba1615389b37effc.png

  ./ 應(yīng)用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.

  --------------------------------

  顯示如下:

c2392ba9297d63c3c668edb0ee7f9d62.png

  5). 總結(jié)

  Gstreamer框架是非常強(qiáng)大的多媒體處理工具,本文只是做了一些簡(jiǎn)單的應(yīng)用示例,更多詳細(xì)說(shuō)明和示例請(qǐng)參考其官方網(wǎng)站。


本站內(nèi)容除特別聲明的原創(chuàng)文章之外,轉(zhuǎn)載內(nèi)容只為傳遞更多信息,并不代表本網(wǎng)站贊同其觀點(diǎn)。轉(zhuǎn)載的所有的文章、圖片、音/視頻文件等資料的版權(quán)歸版權(quán)所有權(quán)人所有。本站采用的非本站原創(chuàng)文章及圖片等內(nèi)容無(wú)法一一聯(lián)系確認(rèn)版權(quán)者。如涉及作品內(nèi)容、版權(quán)和其它問(wèn)題,請(qǐng)及時(shí)通過(guò)電子郵件或電話通知我們,以便迅速采取適當(dāng)措施,避免給雙方造成不必要的經(jīng)濟(jì)損失。聯(lián)系電話:010-82306118;郵箱:aet@chinaaet.com。
主站蜘蛛池模板: 好大灬好硬灬好爽灬| 手机在线看片你懂的| 波多野结衣教室| 国产在线国偷精品免费看| 中文字幕无码不卡免费视频| 欧美视频在线观| 国产日韩精品在线| 中文字幕无码不卡免费视频| 欧美牲交A欧美在线| 国产欧美久久一区二区三区 | 日日碰狠狠添天天爽不卡| 亚洲欧美另类视频| 精品国产自在现线看| 国产成人精品免高潮在线观看 | 国产乱人伦Av在线无码| 伊人色综合久久天天人守人婷 | 亚洲色成人网一二三区| 色欲麻豆国产福利精品| 国产精品99久久久精品无码| a级毛片免费网站| 挺进白嫩老师下面视频| 亚洲AV日韩AV永久无码下载| 波多野结衣痴汉| 午夜成人无码福利免费视频| 韩国伦理电影我妻子的秘密| 国产精品区免费视频| gta5圣堂酒店第三辆车在哪里| 欧美丰满大乳大屁股流白浆| 国产啪精品视频网站丝袜| 91精品免费看| 日本猛少妇色xxxxx猛交| 亚洲日韩精品欧美一区二区一| 精品久久久久久国产| 国产乱码一区二区三区四| 2020阿v天堂网| 天天做天天做天天综合网| 亚洲av永久无码| 亚洲综合精品香蕉久久网| 女人把私人部位扒开视频在线看| 久久国产精品免费一区二区三区| 精品国产乱码久久久久久浪潮|