i.mx6 solo芯片中包含一个VPU (video processing unit),可以进行视频硬件编解码加速,之前RIoTBoard开发板系列笔记(四)—— 使用VPU硬件解码文章简单的记录了使用VPU解码的过程,没有render也没有播放控制。一般音视频开发需要一个框架来实现demux 、decoder、render以及基本的播放控制,linux平台首选的多媒体框架就是GStreamer 。GStreamer 是 GNOME 桌面环境下用来构建流媒体应用的多媒体框架,,详细的内容可以自行去查阅资料,本篇主要记录RIoTBoard使用gstreamer实现视频硬件解码以及播放渲染的过程。

1 multimedia 系统构建

因为要使用 VPU等硬件,还得需要使用Yocto构建系统,系统构建是基于上一篇博客的基础,使用X11作为图形显示库:

DISTRO=fsl-imx-x11 MACHINE=imx6dl-riotboard source  fsl-setup-release.sh -b build-x11

构建系统时需要选择fsl-image-multimedia-full,这样才能把gstreamer 和gst-imx编译进去。

bitbake -k fsl-image-multimedia-full

编译uboot过程中遇到的error可以参考上一篇博客。

2 系统烧写测试

编译完成后将SD card iamge烧写到TF卡中,烧写方法参见上一篇博客。

2.1 gstreamer video sink plugin 测试

系统启动后输入root登陆到console,检查一下imx提供的gstreamer plugin:

gst-inspect-1.0 | grep IMX

结果如下所示,vpudec就是imx提供的支持video硬件解码的plugin。

root@imx6dl-riotboard:~# gst-inspect-1.0 | grep IMX
imxcompositor:  imxcompositor_ipu: IMX ipu Video Compositor
imxcompositor:  imxcompositor_g2d: IMX g2d Video Compositor
imxv4l2:  imxv4l2sink: IMX Video (video4linux2) Sink
imxv4l2:  imxv4l2src: IMX Video (video4linux2) Source
aiurdemux:  aiurdemux: IMX Aiur universal demuxer
beepdec:  beepdec: IMX Beep universal decoder
overlaysink:  overlaysink: IMX Video (video compositor) Sink
imxvideoconvert:  imxvideoconvert_ipu: IMX ipu Video Converter
imxvideoconvert:  imxvideoconvert_g2d: IMX g2d Video Converter
vpu:  vpuenc_h264: IMX VPU-based AVC/H264 video encoder
vpu:  vpuenc_mpeg4: IMX VPU-based MPEG4 video encoder
vpu:  vpuenc_h263: IMX VPU-based H263 video encoder
vpu:  vpuenc_jpeg: IMX VPU-based JPEG video encoder
vpu:  vpudec: IMX VPU-based video decoder

video sink plugin有以下几种可用:

ximagesink:  ximagesink: Video sink
fbdevsink:  fbdevsink: fbdev video sink

ximagesink是基于X11的video 显示plugin,因此需要先配置好X11。系统启动后需要修改/etc/X11/xorg.conf 配置文件,修改内容如下:

Section "Device"Identifier  "Kernel Framebuffer Device"Driver      "vivante"Option      "fbdev" "/dev/fb0"
EndSectionSection "ServerFlags"Option "BlankTime"  "0"Option "StandbyTime"  "0"Option "SuspendTime"  "0"Option "OffTime"  "0"
EndSectionSection "Module"Load "vivante"Load "shadow"
EndSection

然后设置DISPLAY环境变量,将图形显示到当前窗口:

export DISPLAY=:0

然后启动 X Window System:

startx

执行成功后会有如下log:


使用gstreamer videotestsrc测试一下ximagesink显示是否正常:

GST_DEBUG=*:4  gst-launch-1.0 -v videotestsrc ! ximagesink

显示效果图:

fbdevsink可以也直接使用以下命令测试:

GST_DEBUG=*:4  gst-launch-1.0 -v videotestsrc ! fbdevsink

2.2 gstreamer 实现视频播放

gstreamer 视频播放的时候一般选择filesrc + decodebin + sink 这三个plugin就可以实现视频播放,因此可使用以下命令播放视频:

gst-launch-1.0 filesrc location=/home/root/nfs_server/movie1.mp4 !  decodebin !  videoconvert ! ximagesink

其中videoconvert 主要是用于colorspace的转换,因为解码后的数据可能是多种格式的,需要统一转换成video sink支持的colorspace。

root@imx6dl-riotboard:~# gst-inspect-1.0 videoconvert
Factory Details:Rank                     none (0)Long-name                Colorspace converterKlass                    Filter/Converter/VideoDescription              Converts video from one colorspace to anotherAuthor                   GStreamer maintainers <gstreamer-devel@lists.freedesktop.org>

播放效果如下:

riotboard卡顿

播放过程中发现比较卡,好长时间才render一帧,而且会有如下log印出:

WARNING: from element /GstPipeline:pipeline0/GstXImageSink:ximagesink0: A lot of buffers are being dropped.
Additional debug info:
../../../../git/libs/gst/base/gstbasesink.c(2902): gst_base_sink_is_too_late (): /GstPipeline:pipeline0/GstXImageSink:ximagesink0:
There may be a timestamping problem, or this computer is too slow.

此时说明cpu 处理不过来了,因为使用的是VPU 硬件解码,解码速度应该完全没有问题,而render 也不会有太大问题,唯一可能出问题的就是中间的videoconvert这个处理速度太慢,这个组件完全是软件进行colorspace转换,速度可能满足不了30pfs的要求,后来发现imx 提供了硬件convert,于是改用硬件convert测试一下。

imxvideoconvert:  imxvideoconvert_ipu: IMX ipu Video Converter
imxvideoconvert:  imxvideoconvert_g2d: IMX g2d Video Converter

使用硬件convert的播放命令如下:

gst-launch-1.0 filesrc location=/home/root/nfs_server/movie1.mp4 !  decodebin !  imxvideoconvert_ipu ! ximagesink

果然,播放1920*1080的视频流畅多了,效果如下:

riotboard播放视频流畅

3 参考

1 https://gstreamer-devel.narkive.com/CZ46YRpI/how-to-demux-a-mp4-file-to-a-encoded-264-video-file-by-qtdemux
2 https://community.toradex.com/t/how-to-operate-with-aiurdemux-in-gstreamer-1-0/4726
3 https://community.nxp.com/t5/i-MX-Processors/Playing-multiple-videos-on-mx6/m-p/619326

RIoTBoard开发板系列笔记(十二)—— gstreamer + vpu实现视频硬件解码播放相关推荐

  1. RIoTBoard开发板系列笔记(四)—— 使用VPU硬件解码

    视频解码分为软解和硬解两种,简单的来说纯粹依靠CPU来解码的称为软解,而使用GPU/VPU解码的称为硬解.常规地直接用CPU解码会极大地消耗CPU的运算能力,硬件解码是通过显卡的视频加速功能对高清视频 ...

  2. RIoTBoard开发板系列笔记(三)—— 移植Gstreamer

    之前arm-linux-cc 4.4.3 交叉编译gstreamer1.18博客里搞了一下Gstreamer的交叉编译,本来想试一下gstreamer移植到友善之臂2416开发板上的效果,奈何开发板资 ...

  3. 转载:百为STM32开发板教程之十二——NAND FLASH

    http://bbs.21ic.com/icview-586200-1-1.html 百为STM32开发板教程之十二--NAND FLASH 参考资料: 百为stm32开发板光盘V3\百为stm32开 ...

  4. 小日历实验目的Android,【连载】【星光闪电STM32F407开发板】第十二章 RTC实验

    [连载][星光闪电STM32F407开发板]第十二章 RTC实验 [复制链接] 第十二章RTC实验 12.1 实验目的 本实验旨在掌握STM32的实时时钟RTC的使用,利用其测量日期时间,数据手册请参 ...

  5. 阿里云HaaS100物联网开发板学习笔记(二)硬件控制初步--让小灯闪烁起来

    摘要:无论是哪种开发板,要想开发特定的功能,必先从GPIO开始,HaaS100开发也是一样.如果仅仅利用HaaS100的联网功能,那简直是太浪费了.HaaS100拥有其他开发板所具备的所有的功能,比如 ...

  6. HaaS600物联网开发板学习笔记(二)---轻应用方式让LED闪烁起来

    摘要:轻应用开发非常方便快捷,gitee上的例程也都是基于HaaS600的,所以,拿HaaS600来逐个测试例程,学习轻应用开发和物联网应用是最合适的.本文介绍一下HaaS600如何使用轻应用来开发. ...

  7. 百为STM32开发板教程之十二——NAND FLASH

    参考资料: 百为stm32开发板光盘V3\百为stm32开发板光盘\芯片数据手册\K9F1208.pdf 百为stm32开发板光盘\st官方参考资料\Application notes\AN2784 ...

  8. 阿里云HaaS100物联网开发板学习笔记(六)做个智能灯---一个完整的开发例子

    摘要:本篇文章将前期几个专题综合起来,基于阿里云HaaS100的新固件设计制作一个智能灯.这个智能灯由云平台.手机APP端和设备端组成,基本上涵盖了一个物联网小项目所需的主要步骤. 目录 1.在阿里云 ...

  9. 阿里云HaaS100物联网开发板学习笔记(三)轻应用初步--用js让小灯闪烁起来

    摘要:能让JavaScript应用运行在haas100开发板上,这实在是太酷了,这种方式被阿里云称之为"轻应用".本文带各位从零开始,先了解啥是轻应用,然后搭建环境,再一步步将一个 ...

最新文章

  1. Luogu 4438 [HNOI/AHOI2018]道路
  2. 别再被 Python 洗脑了!!
  3. Asp.net下web.config或是bin中的dll有变更后,重启的问题
  4. 二进制异或--7.18待完善
  5. windows mongdb 安装
  6. 一个由正则表达式引发的血案
  7. Composer学习之————Ubuntu14.04下安装Composer
  8. Centos服务器查看当前的并发数
  9. Python使用装饰器和线程限制函数执行时间的方法
  10. Facebook 开源 3D 深度学习函数库 PyTorch3D,也可用于二维场景
  11. [HTA] - HTML应用程序
  12. 两种云原生技术在弹性计算的使用、原理和思考
  13. oracle的备份恢复命令,Oracle RMAN的备份与恢复命令详解
  14. python安装pygame的命令是什么_Python的pygame安装教程详解
  15. 信号的时频分析MATLAB,基于matlab的信号时频分析仿真
  16. Qt 5.2.1 applications (32 bit) in CentOS (64 bit with gcc 4.8.2)
  17. UVA11105 H-半素数 Semi-prime H-numbers(线性筛+前缀和+暴力)
  18. 程序员从来没给丈母娘买礼物,真相竟然令人沉默
  19. Docker中ubuntu镜像安装ps显示进程
  20. PostgreSQL-Docker创建PostgreSQL数据库并导入矢量数据

热门文章

  1. html打开无法显示网页怎么回事,Win7打开网页提示“Internet Explorer无法显示该页面”如何解决?...
  2. JS实现简单的登录注册页签
  3. 2012年华为杯校园编程大赛决赛 类别:软件C/C++语言
  4. 如何使用Kotlin构建Android旋转旋钮以帮助儿子练习钢琴
  5. STM32Cube工具学习笔记(一)Cube配置
  6. 同居mm_倾向于同居
  7. Debian 11 修改 DNS 服务器
  8. 构建面向未来的前端架构
  9. RTL8197F/RTL8812F WiFi设置为WPA3加密手机提示拒绝连接问题解决方案
  10. 挂耳式蓝牙耳机哪家的好用,推荐几款实用的挂耳式耳机