1). 简介

随着ARM平台性能的日益强大和嵌入式设备的发展,对于多媒体处理如音视频播放,摄像头,流媒体处理等需求也日益增多,本文就通过几个基于嵌入式Linux下多媒体应用的示例来简单展示下使用Gstreamer框架进行多媒体处理的方法.

Gstreamer是一个基于Pipeline的多媒体框架,基于GObject,以C语言写成,目前是嵌入式Linux最为常用的处理多媒体应用框架. Element是Gstreamer最重要和基本的对象类,通过Plugin的形式提供,多个Elements可以组合为bin,并进一步聚合形成一个Pipeline完成一个多媒体应用处理.

2). 硬件准备

./ 本文测试所使用平台为Toradex Colibri i.MX6 ARM计算机核心板模块, 基于NXP i.MX6 SoC, 配合Colibri开发板.

./ 摄像头作为多媒体输入源使用Logitech 720P USB摄像头

3). 软件准备

./ OS为Toradex官方Ycoto project兼容嵌入式Linux发布 V2.5 beta3.

./ Gstreamer-0.10, 系统自带

./ 安装gstreamer相关插件包

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

root@colibri-imx6:~# opkg update

root@colibri-imx6:~# opkg install gst-plugins-base-meta gst-plugins-good-meta

root@colibri-imx6:~# wget http://feeds.angstrom-distribution.org/feeds/v2015.06/ipk/glibc/armv7ahf-vfp-neon/base/lib**codec54_9.16-r0.9_armv7ahf-vfp-neon.ipk

root@colibri-imx6:~# wget http://feeds.angstrom-distribution.org/feeds/v2015.06/ipk/glibc/armv7ahf-vfp-neon/base/libswscale2_9.16-r0.9_armv7ahf-vfp-neon.ipk

root@colibri-imx6:~# wget http://feeds.angstrom-distribution.org/feeds/v2015.06/ipk/glibc/armv7ahf-vfp-neon/base/lib**util52_9.16-r0.9_armv7ahf-vfp-neon.ipk

root@colibri-imx6:~# wget http://feeds.angstrom-distribution.org/feeds/v2015.06/ipk/glibc/armv7ahf-vfp-neon/base/lib**format54_9.16-r0.9_armv7ahf-vfp-neon.ipk

root@colibri-imx6:~# opkg install lib**util52_9.16-r0.9_armv7ahf-vfp-neon.ipk

root@colibri-imx6:~# opkg install lib**codec54_9.16-r0.9_armv7ahf-vfp-neon.ipk

root@colibri-imx6:~# opkg install libswscale2_9.16-r0.9_armv7ahf-vfp-neon.ipk

root@colibri-imx6:~# opkg install lib**format54_9.16-r0.9_armv7ahf-vfp-neon.ipk

root@colibri-imx6:~# opkg install gst-ffmpeg

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

4). 测试gstreamer

Gstreamer提供了两个非常方便的工具gst-launch和gst-inspect,在真正将Gstreamer pipeline集成到你的程序里面前,可以使用这两个工具在命令行下面进行pipeline的准备和测试,本文也主要基于这种模式进行演示,而详细的关于Gstreamer在程序中使用方法请参考这里.

gst-inspect可以用来查看当前系统已经安装的plugin或者具体查看某个element的属性来判定pipeline中elements互联兼容性,详细说明请见这里.

gst-launch 用于编译和运行一个pipeline,可以方便的对pipeline进行不同组合尝试并测试,如下面用来显示一个视频测试图案.

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

root@colibri-imx6:~# gst-launch videotestsrc ! 'video/x-raw-rgb, width=(int)640,height=(int)480' ! ximagesink

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

5). 应用示例

a). 播放摄像头

使用v4l2src元件采集摄像头视频,视频格式为YUY2/帧率30/分辨率640x480; 使用imxv4l2sink元件利用GPU加速播放采集的视频; 如果使用ximagesink元件来播放则没有硬件加速.

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

root@colibri-imx6:~# gst-launch v4l2src device=/dev/video0 ! 'video/x-raw-yuv, framerate=30/1, width=(int)640, height=(int)480, format=(fourcc)YUY2' ! imxv4l2sink disp-width=640 disp-height=480

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

目标板CPU占用率: 37.5%

b). 采集摄像头保存为文件

同样使用v4l2src元件采集摄像头视频; ffmpegcolorspace元件转换颜色格式为I420; vpuenc元件调用硬件VPU进行H.264编码; matroskamux元件进行mkv mux;  filesink元件输出到文件

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

root@colibri-imx6:~# gst-launch -v v4l2src device=/dev/video0 ! ffmpegcolorspace ! 'video/x-raw-yuv, framerate=30/1, width=(int)640, height=(int)480, format=(fourcc)I420' ! queue max-size-buffers=2 ! vpuenc codec=6 ! matroskamux ! filesink location=output.mkv

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

目标板CPU占用率: 40%

c). 回放视频文件

使用filesrc元件读取视频文件; aiurdemux元件进行demux; vpudec元件通过硬件VPU进行H.264解码; imxv4l2sink元件播放.

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

root@colibri-imx6:~# gst-launch filesrc location=/home/root/output.mkv typefind=true ! aiurdemux ! queue ! vpudec ! imxv4l2sink disp-width=640 disp-height=480

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

目标板CPU占用率: 3.5%

d). RTP摄像头流媒体到远程主机

使用v4l2src元件采集摄像头; ffmpegcolorspace转换颜色格式; vpuenc元件调用硬件VPU进行H.264编码;rtph264pay元件进行h264流rtp封装; udpsink元件进行udp传输.

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

//Ubuntu主机IP: 10.20.1.116

//Colibri i.MX6目标板IP: 10.20.1.122

/* Colibri i.MX6 */

gst-launch -v v4l2src device=/dev/video0 ! ffmpegcolorspace! 'video/x-raw-yuv, framerate=30/1, width=(int)640, height=(int)480, format=(fourcc)I420' ! vpuenc codec=6 ! rtph264pay ! udpsink host=10.20.1.116 port=5000

/* Ubuntu 主机 */

//Ubuntu 14.04, 安装gstreamer-ffmpeg

wget http://ppa.launchpad.net/mc3man/gstffmpeg-keep/ubuntu/pool/main/g/gstreamer0.10-ffmpeg/gstreamer0.10-ffmpeg_0.10.13-5ubuntu1~trusty2.1_amd64.deb && sudo dpkg -i gstreamer0.10-ffmpeg_0.10.13-5ubuntu1~trusty2.1_amd64.deb

//播放流媒体, caps设置从目标板获得

gst-launch-0.10 udpsrc port=5000 caps="application/x-rtp, media=(string)video, clock-rate=(int)90000, encoding-name=(string)H264, sprop-parameter-sets=(string)\"Z0JAHqaAoD2QAA\\=\\=\\,aM44gAA\\=\", payload=(int)96, ssrc=(uint)1172839120, clock-base=(uint)784846202,
seqnum-base=(uint)58343" ! rtph264depay ! ffdec_h264 ! ximagesink

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

目标板CPU占用率: 35%

6). Gstreamer1.0应用示例

Colibri i.MX6 最新Linux发布版本V2.6beta1已经支持gstreamer1.0,升级方法请见这里

./ 软件准备

安装相关插件包

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

opkg update

opkg install gstreamer1.0-plugins-base-meta

opkg install gstreamer1.0-plugins-good-meta

opkg remove --force-depends libgstimxcompositor0 //目前版本中需要移除否则无法使用gstreamer

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

./ 应用示例

a). 播放摄像头

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

root@colibri-imx6:~# gst-launch-1.0 imxv4l2src device=/dev/video0 ! 'video/x-raw, framerate=30/1, width=(int)640, height=(int)480, format=(string)YUY2' ! imxv4l2sink overlay-width=640 overlay-height=480

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

目标板CPU占用率: 30%

b).  采集摄像头保存为文件

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

root@colibri-imx6:~# gst-launch-1.0 imxv4l2src device=/dev/video0 ! videoconvert ! 'video/x-raw, framerate=30/1, width=(int)640, height=(int)480, format=(string)I420' ! queue max-size-buffers=2 ! vpuenc_h264 ! matroskamux ! filesink location=output.mkv

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

目标板CPU占用率: 16%

c). 回放视频文件

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

root@colibri-imx6:~# gst-launch-1.0 filesrc location=/home/root/output.mkv typefind=true ! matroskademux ! queue ! vpudec ! imxv4l2sink overlay-width=640 overlay-height=480

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

目标板CPU占用率: 4%

d). RTP摄像头流媒体到远程主机

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

//Ubuntu主机IP: 10.20.1.116

//Colibri i.MX6目标板IP: 10.20.1.122

/* Colibri i.MX6 */

gst-launch-1.0 imxv4l2src device=/dev/video0 ! videoconvert ! 'video/x-raw, framerate=30/1, width=(int)640, height=(int)480, format=(string)I420' ! queue max-size-buffers=2 ! vpuenc_h264 ! rtph264pay ! udpsink host=10.20.1.116 port=5000

/* Ubuntu 主机 */

//Ubuntu 14.04, 安装lib** (同0.10 ffmpeg)

sudo apt-get install gstreamer1.0-lib**

//播放流媒体

gst-launch-1.0 udpsrc port=5000 caps="application/x-rtp, media=(string)video, clock-rate=(int)90000,encoding-name=(string)H264, payload=(int)96" ! rtph264depay ! **dec_h264 ! videoconvert ! ximagesink

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

目标板CPU占用率: 13%

e). 摄像头连接到远程主机tcp视频流到目标版再rtp回远程主机播放

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

//Ubuntu主机IP: 10.20.1.116

//Colibri i.MX6目标板IP: 10.20.1.122

/* Ubuntu 主机 */

//采集摄像头并建立tcp server

gst-launch-1.0 v4l2src device=/dev/video0 ! videoconvert ! 'video/x-raw, framerate=30/1, width=(int)640, height=(int)480, format=(string)I420' ! jpegenc ! tcpserversink host=10.20.1.116 port=5000

/* Colibri i.MX6 */

//从tcp server获取摄像头视频流,并进行H.264压缩后rtp回远程主机

gst-launch-1.0 tcpclientsrc host=10.20.1.116 port=5000 ! jpegdec ! queue max-size-buffers=2 ! vpuenc_h264 ! rtph264pay ! udpsink host=10.20.1.116 port=5001

/* Ubuntu 主机 */

//播放rtp视频流

gst-launch-1.0 udpsrc port=5001 caps="application/x-rtp, media=(string)video, clock-rate=(int)90000,encoding-name=(string)H264, payload=(int)96" ! rtph264depay ! **dec_h264 ! videoconvert ! ximagesink

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

目标板CPU占用率: 31%

7). 总结

由上面示例可见Gstreamer是一个非常强大且配置灵活的多媒体处理框架,并且配合相应的plugin,也可以充分调用硬件GPU/VPU加速,使其能够在嵌入式设备上面利用有限的资源高效的实现广泛的多媒体应用.

【miscellaneous】【ARM-Linux开发】ARM平台基于嵌入式Linux Gstreamer 使用的更多相关文章

  1. 嵌入式Linux开发系列之一: 走进嵌入式Linux的世界

    转载:http://www.ibm.com/developerworks/cn/linux/l-embed/part1/index.html   随着信息化技术的发展和数字化产品的普及,以计算机技术. ...

  2. 基于嵌入式Linux的千兆以太网卡驱动程序设计及测试

    一. 引言 千兆以太网是一种具有高带宽和高响应的新网络技术,相关协议遵循IEEE 802.3规范标准.采用和10M以太网相似的帧格式.网络协议和布线系统,基于光纤和短距离同轴电缆的物理层介质,更适用于 ...

  3. X86平台下嵌入式linux触摸屏解决方案(usb触摸屏控制器+完美校准方案+触摸屏QTE开发环境搭建)

    一直在用X86平台,真心不想用WINCE和XPE,一些大的硬件供应商都不提供linux平台下的技术支持,比如研华的3343PC104系列的板子... 开发的问题如下: 1 USB控制器目前只有台湾和竹 ...

  4. 手把手带你基于嵌入式Linux移植samba服务

    摘要:Samba是在Linux和UNIX系统上实现SMB协议的一个免费软件,由服务器及客户端程序构成. 本文分享自华为云社区<嵌入式Linux下移植samba服务--<基于北斗和4G ca ...

  5. 7、基于嵌入式Linux的视频采集系统---UVC驱动模型介绍

    UVC 即 usb video class.USB协议中,除了通用的软硬件电气接口规范等,还包含了各种各样的Class协议,用来为不同的功能定义各自的标准接口和具体的总线上的数据交互格式和内容.这些C ...

  6. 基于嵌入式linux路由转发功能的实现

    环境 arm7开发板, uclinux系统,kernel version: linux-2.4.x arm芯片的单网卡双网口设备,eth0 WAN口 ipaddr 192.168.9.61 eth0: ...

  7. 3G下的无压缩视频传输(基于嵌入式linux) (转载)

    本课题研究嵌入式系统在数据采集,3G无线通信方面的应用,开发集视频采集.地理信息采集.无线传输.客户机/服务器模式于一体的车载终端,实现终端采集视频与GPS信息的传输,支持服务器端显示视频与GPS信息 ...

  8. Yocto开发笔记之《嵌入式linux libcurl编程》(QQ交流群:519230208)

    开了一个交流群,欢迎爱好者和开发者一起交流,转载请注明出处. QQ群:519230208,为避免广告骚扰,申请时请注明 “开发者” 字样 =============================== ...

  9. Linux开发环境搭建与使用——Linux必备软件之Samba

    假如我们是在ubuntu环境上做对应的开发.有的时候,我们须要把我们写的程序共享给别人,或者,自己拷贝出来备份一份.我们习惯用U盘拷贝,假设须要频繁拷贝的话,这样会不太方便.这里给大家介绍一种更好的方 ...

随机推荐

  1. IntelliJ IDEA——数据库集成工具(Database)的使用

    https://www.cnblogs.com/huiyi0521/p/10125537.html idea集成了一个数据库管理工具,可以可视化管理很多种类的数据库,意外的十分方便又好用.这里以ora ...

  2. 发布VS源码

    发布VS源码步奏 先将Web.config设置修改一下   IP设置成点    文件名称设置成文件夹的名称,右键点击项目,点发布   勾选删除现有文件,点击发布 打开文件加  将文件解压成压缩包, 打 ...

  3. 一些VMware vCenter Appliance的默认用户名和密码

    一些VMware vCenter Appliance的默认用户名和密码 2014-03-30 17:30:03 flowershade_21 阅读数 13367更多 分类专栏: vmware   VM ...

  4. 洛谷 P2119 魔法阵 题解

    Analysis 这道题也是考试题,我也依然打了个n三次方暴力.正解是先枚举差,再枚举c和d,a和b用乘法原理优化,这样就能大大减少时间. #include<iostream> #incl ...

  5. MySQL 计算时间差函数 TIMESTAMPDIFF、DATEDIFF

    一.TIMESTAMPDIFF 支持天.小时.秒等 selet TIMESTAMPDIFF(hour,odl_time,now()); 计算old_time与现在时间的小时差. 二.DATEDIFF ...

  6. AS400遇到的一些问题和解决办法

    1.没有权限进入distribution directory wrklnk 'QDLS\'    >User not enrolled in system distribution direct ...

  7. learning scala How To Create Variable Argument Function - varargs :_ *

    Scala collection such as List or Sequence or even an Array to variable argument function using the s ...

  8. AdvanceEast源码理解

    目录 文章思路 源码理解 一. 标签点形式 按顺序排列四个点,逆时针旋转,且第一个点为左上角点(刚开始选择最左边的点, 二. 标签切边 三. loss计算 四. NMS 最后说明 文章思路 大神的gi ...

  9. GB∕T 35658平台过检 已通过最新的部标JT/T 808-2019, JT/T 809-2019标准检测

    2019年交通部GPS平台检测标准发生了重大变化, 原来的796平台功能标准, 变更为GB/T35658标准, 这个标准其实2017年就公布了, 实际上还是796标准, 但是检测项目,以前是可选的, ...

  10. nginx 转发 header 数据丢失

    刚帮同事解决了个问题,记录一下,现象:放在header里面的数据,本地后台可以收到,集成可以收到,测试不行, 查看代码没问题,排除代码问题,比较集成和测试环境有何不同,发现集成环境是局域网访问,192 ...