1. 程式人生 > >嵌入式Linux下Gstreamer程式設計示例

嵌入式Linux下Gstreamer程式設計示例

By Toradex秦海

1). 簡介

Gstreamer多媒體開發框架是當前嵌入式Linux裝置最為常用的多媒體應用處理平臺,關於Gstreamer開發框架的介紹請參考我們過往發表的其他相關文章,這裡不再贅述而是直接展示使用C語言基於Gstreamer進行攝像頭處理的示例程式開發。

本文所演示的平臺來自於Toradex Aaplis iMX6D嵌入式平臺,這個平臺是基於NXP iMX6系列ARM處理器,支援雙核心Cortex-A9。

2). 準備

a). Apalis iMX6D ARM核心版配合Apalis Ixora載板,連線除錯串列埠到開發主機,具體操作方法可以參考這裡

b). Apalis iMX6D作業系統使用Toradex Linux Release V2.7b2,下載和更新方法請參考

這裡

c). 連線一個USB Camera到Ixora載板X8靠上的USB介面,這裡使用Logitech 720P攝像頭。

3). 配置Ubuntu開發主機

a). 安裝Toradex提供的交叉編譯SDK,可以基於OpenEmbedded環境自行編譯,也可以從這裡下載我們已經編譯好的進行測試使用,下載後執行下面命令進行安裝,並根據提示設定安裝目錄。

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

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

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

b). 本文使用Eclipse IDE進行開發,請參考

這裡的文章說明在Eclipse配置基本的SDK交叉編譯相關設定。

c). 啟動Eclipse並建立Gstreamer新專案

./ 在啟動Eclipse之前,首先開啟Terminal並執行下面命令配置SDK,配置在Terminal關閉時候失效,下次使用要重新配置。

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

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

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

./ 然後在同一Terminal下啟動Eclipse IDE

./ 建立新的Cross GCC專案,這裡為gstest

d). 設定Gstreamer編譯選項

./gstest –> Properties -> C/C++ Build -> Settings –> Tool Settings -> Cross GCC Compiler -> Miscellaneous -> Other flags 新增下面內容

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

`pkg-config --cflags gstreamer-1.0` -fPIC

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

./ ./gstest –> Properties -> C/C++ Build -> Settings –> Tool Settings -> Cross GCC Linker -> Miscellaneous -> Linker flags新增下面內容

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

`pkg-config --libs gstreamer-1.0 gobject-2.0 glib-2.0`

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

4). C程式開發示例

a). 本文演示C程式main程式中主要實現三種Gstreamer應用示例,第一種是捕獲USB攝像頭輸入影象並顯示在桌面上,第二種是捕獲USB攝像頭輸入影象並進行H.264編碼後儲存為MKV視訊檔案,第三種是讀取上面第二種儲存的視訊檔案並播放顯示在桌面上面。

b). 程式完整程式碼如下,分別說明如下:

./ Main函式首先建立所需要使用的Elements和bus等,然後初始化gstreamer並建立main loop。

./ 然後通過程式輸入引數做三個選項,分別對應上面提到的三個子應用。

./ 應用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在程式中先建立pipeline,然後再分別呼叫”gst_element_factory_make”函式匹配實際使用的elements,最後建立pipeline message bus和monitor。

// 然後呼叫”gst_bin_add_many”函式將剛才生成的elements新增到pipeline中。

// 最後呼叫”gst_element_link_many”函式順序連結各個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=640 overlay-height=480

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

// 後面的程式基本上和上面應用1是類似的方法配置,只是有一個元件需要注意,就是”matroskademux”,通過”gst-inspect”檢視可以得知其sink pad是根據src資料情況動態產生的,這樣導致在上面測試piepeline的時候沒有問題,但是做C程式開發的時候就需要我們來處理這個事件,因此我們添加了”on_pad_added”函式,並在main函式中呼叫”g_signal_connect”函式來動態連結pipeline中的demux元件和decoder元件。

./ main函式最後通過”gst_element_set_state”函式play pipeline,並通過” g_main_loop_run”函式開始迴圈。

c). 測試上述c程式程式碼執行請見如下:

./ 應用1:

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

[email protected]:~# ./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 10 2017 02:13:12. ======                 

====== IMXV4L2SINK: 4.1.4 build on Apr 10 2017 02:13:12. ======                

display(/dev/fb0) resolution is (1920x1080).                                   

Running                                                                        

v4l2sink need allocate 3 buffers.

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

顯示如下:

 

./ 應用2:

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

[email protected]:~# ./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 10 2017 02:13:12. ======                 

[INFO]  Product Info: i.MX6Q/D/S                                               

====== VPUENC: 4.1.4 build on Apr 10 2017 02: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:

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

[email protected]:~# ./gstest 3 output.mkv                                      

[INFO]  Product Info: i.MX6Q/D/S                                                

====== IMXV4L2SINK: 4.1.4 build on Apr 10 2017 02:13:12. ======                

display(/dev/fb0) resolution is (1920x1080).                                   

[INFO]  Product Info: i.MX6Q/D/S                                                

====== VPUDEC: 4.1.4 build on Apr 10 2017 02: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). 總結

Gstreamer框架是非常強大的多媒體處理工具,本文只是做了一些簡單的應用示例,更多詳細說明和示例請參考其官方網站。

相關推薦

嵌入式LinuxGstreamer程式設計示例

By Toradex秦海 1). 簡介 Gstreamer多媒體開發框架是當前嵌入式Linux裝置最為常用的多媒體應用處理平臺,關於Gstreamer開發框架的介紹請參考我們過往發表的其他相關文章,這裡不再贅述而是直接展示使用C語言基於Gstreamer進行攝像頭處理的示例

linuxsocket程式設計基礎示例

本文主要用於記錄(因為有道雲容易丟失資料),程式碼並不規範,所有的內容都解除安裝main()函式裡面了,主要目的是為了方便自己理清流程。 服務端的程式碼: #include<unistd.h> #include<sys/types.h> #incl

嵌入式LinuxQt的中文顯示

tdi IT too file ron main.c nts 環境變量 copy 一般情況下,嵌入式Qt界面需要中文顯示,下面總結自己在項目中用到的可行的辦法 1,下載一種中文簡體字體,比如我用的是”方正準圓簡體“,把字體文件放在ARM開發板系統的Qt字庫中,即/usr/l

LinuxTCP程式設計

首先要建立伺服器建立起socket,然後與本地的埠進行繫結,接著就開始接收客戶端的請求並建立與它的連線,接下來,客戶端傳送的訊息。 tcpserver.c程式碼: int main() { struct sockaddr_in server_sockaddr,client_s

linuxGTK程式設計:顯示CPU使用率,記憶體使用率,網速。

StartOS 5.1版GNOME核心linux用了一段時間後,一直想視窗程式設計,QT最先搭建好,QT入門做了一個系統資訊,重灌系統後發現不能運行了,要安裝QT環境才能執行,於是想做一種低依賴的系統級程式設計,因為StartOS已經停止更新了,千辛萬苦第三次才成功搭建GTK環境,結合C語言對QT原

程序和執行緒及Linux程式設計

程序和執行緒及Linux下的程式設計 一、概述 程序和執行緒網路上有一堆解釋,我不喜歡抄襲,也不喜歡套用太教科書的說法。就以我自己的理解來說說程序和執行緒吧,當然自己的理解肯定不是很嚴謹,但是理解起來應該會比教科書快一點。程序和執行緒都可以認為是併發執行程式,但是隻有多處理器下的多執行緒

LinuxGCC程式設計四個過程

在Linux下進行C語言程式設計,必然要採用GNU GCC來編譯C原始碼生成可執行程式。 一、GCC快速入門 Gcc指令的一般格式為:Gcc [選項] 要編譯的檔案 [選項] [目標檔案] 其中,目標檔案可預設,Gcc預設生成可執行的檔名為:編譯檔案.out 我們來看一下經典入門程式"Hello W

LINUXC++程式設計如何獲得某程序的ID

#include <stdio.h> #include <stdlib.h> #include <unistd.h> using namespace std; pid_t getProcessPidByName(const char *proc_name) {

解決Linux網路程式設計(sendto send )出現 SIGPIPE 訊號導致程式異常終止的問題

引言 最近在Linux下網路程式設計時,出現SIGPIPE 訊號導致程式異常終止,本文記錄下解決的方法以及相應的知識。 SIGPIPE 訊號資料 什麼時候出現此訊號,APUE中有關此訊號的解釋如下: Linux man手冊有關此訊號的解釋: man 7 signal SI

LVGUI在嵌入式LINUX的編譯

    本文比較亂,算是一個隨筆,記錄一下將LVGUI交叉編譯到MIPS架構的嵌入式Linux裝置中,主要關於自己編寫對應的makefile來對LVGUI進行編譯。 首先,Makefile 最好和lv的幾個工程目錄在同一目錄下,如下圖: 其次,為了讓標頭檔案(h檔

嵌入式LinuxCAN匯流排配置

題背景:本人開發板使用的是迅為iTOP4412精英版,額外購買的CAN/485模組,如下圖:   但是插上模組之後,在終端使用ifconfig can0命令發現開發板讀不到CAN裝置,顯示“ifconfig: SIOCGIFFLAGS: No such device”。如下圖:   在重新配置核心後,可以讀出

linuxsocket程式設計“Broken pipe”錯誤

工作需要,對接伺服器的時候,客戶端傳送資料報錯“Broken pipe” 原因是對一個已關閉的套接字write兩次 細節講解參考:https://www.cnblogs.com/jingzhishen/p/3453727.html   demo 客戶端程式碼: #i

linuxgcc程式設計06-c語言參考手冊

一。 c語言標準庫介紹 二。c語言參考案例  巨集定義 巨集是在gcc編譯預處理階段就會執行的程式碼   //#pragma命令可以讓程式設計者讓編譯器執行某些事 #include <stdio.h> //包含io流的庫 標準的輸入和輸出 ""首先在

linuxgcc程式設計05-window開發工具安裝

一。 window下開發環境安裝   Unix下編譯通過的C程式碼,在win32下編譯是不能通過的 ,當然Unix 和win32的API都是符合標準C,也就是說,大多數函式呼叫在unix和win32下是相同的.但是,unix有自己一些獨特的API(如fork,spawn,s

linuxgcc程式設計04-cmake工程管理

一。cmake簡介  CMake是一個跨平臺的編譯、安裝、測試以及打包工具;CMake不直接編譯軟體,而是結合原生構建系統來構建軟體。    CMake配置檔案是CMakeList.txt檔案(每個原始碼資料夾下都要有一個),CMake根據配置檔案再生成Unix的Makef

Linux Socket程式設計基礎

作者: 東北大學秦皇島分校軟體中心技術研發部 敬茂華 1、 引言Linux的興起可以說是Internet創造的一個奇蹟。Linux作為一個完全開放其原始碼的免費的自由軟體,相容了各種UNIX標準(

linuxshell 程式設計之擴充套件正則表示式

1. ‘+’ 限定字元 +限定符表示前面字元至少出現一次或者多次。與*不同在於0次或者多次 2. '?' 限定符 ?限定前面的字元最多出現一次。即出現0次或者1次 3. 數線 |和圓括號() 例如

Linuxshell程式設計例項

1.用while語句建立一個根據輸入的數值求累加和(1+2+3+。。。。+n)的shell程式。   while           若干個命令列1        do              若干個命令列2        done    結構 #! /bin/b

linuxshell程式設計print與printf的區別

1,print是ksh的內建命令,而printf是bash的內建命令 2,print 中不能使用%s ,%d 或%c; 3,print 自動換行,printf 沒有自動換行。 比如下面指令碼的輸出:

嵌入式LinuxALSA音訊架構ALSA-lib移植與編譯心得

*************************************************************************************************************************** 作者:EasyWave