《电子技术应用》
您所在的位置:首页 > 模拟设计 > 业界动态 > 嵌入式Linux下Gstreamer编程示例

嵌入式Linux下Gstreamer编程示例

2017-08-03
关键词: Linux下Gstreamer ARM

  1). 简介

  Gstreamer多媒体开发框架是当前嵌入式Linux设备最为常用的多媒体应用处理平台,关于Gstreamer开发框架的介绍请参考我们过往发表的其他相关文章,这里不再赘述而是直接展示使用C语言基于Gstreamer进行摄像头处理的示例程序开发。

  本文所演示的平台来自于Toradex Aaplis iMX6D嵌入式平台,这个平台是基于NXP iMX6系列ARM处理器,支持双核心Cortex-A9。

  2). 准备

  a). ApalisiMX6D ARM核心版配合ApalisIxora载板,连接调试串口到开发主机,具体操作方法可以参考这里。

  b). Apalis iMX6D操作系统使用Toradex LinuxRelease 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). 程序完整代码如下,分别说明如下:

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

  ./ 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=640overlay-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:

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

  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

  ./ 应用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

  ./ 应用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). 总结

  Gstreamer框架是非常强大的多媒体处理工具,本文只是做了一些简单的应用示例,更多详细说明和示例请参考其官方网站。


本站内容除特别声明的原创文章之外,转载内容只为传递更多信息,并不代表本网站赞同其观点。转载的所有的文章、图片、音/视频文件等资料的版权归版权所有权人所有。本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如涉及作品内容、版权和其它问题,请及时通过电子邮件或电话通知我们,以便迅速采取适当措施,避免给双方造成不必要的经济损失。联系电话:010-82306118;邮箱:aet@chinaaet.com。