RIoTBoard开发板系列笔记(十二)—— gstreamer + vpu实现视频硬件解码播放
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实现视频硬件解码播放相关推荐
- RIoTBoard开发板系列笔记(四)—— 使用VPU硬件解码
视频解码分为软解和硬解两种,简单的来说纯粹依靠CPU来解码的称为软解,而使用GPU/VPU解码的称为硬解.常规地直接用CPU解码会极大地消耗CPU的运算能力,硬件解码是通过显卡的视频加速功能对高清视频 ...
- RIoTBoard开发板系列笔记(三)—— 移植Gstreamer
之前arm-linux-cc 4.4.3 交叉编译gstreamer1.18博客里搞了一下Gstreamer的交叉编译,本来想试一下gstreamer移植到友善之臂2416开发板上的效果,奈何开发板资 ...
- 转载:百为STM32开发板教程之十二——NAND FLASH
http://bbs.21ic.com/icview-586200-1-1.html 百为STM32开发板教程之十二--NAND FLASH 参考资料: 百为stm32开发板光盘V3\百为stm32开 ...
- 小日历实验目的Android,【连载】【星光闪电STM32F407开发板】第十二章 RTC实验
[连载][星光闪电STM32F407开发板]第十二章 RTC实验 [复制链接] 第十二章RTC实验 12.1 实验目的 本实验旨在掌握STM32的实时时钟RTC的使用,利用其测量日期时间,数据手册请参 ...
- 阿里云HaaS100物联网开发板学习笔记(二)硬件控制初步--让小灯闪烁起来
摘要:无论是哪种开发板,要想开发特定的功能,必先从GPIO开始,HaaS100开发也是一样.如果仅仅利用HaaS100的联网功能,那简直是太浪费了.HaaS100拥有其他开发板所具备的所有的功能,比如 ...
- HaaS600物联网开发板学习笔记(二)---轻应用方式让LED闪烁起来
摘要:轻应用开发非常方便快捷,gitee上的例程也都是基于HaaS600的,所以,拿HaaS600来逐个测试例程,学习轻应用开发和物联网应用是最合适的.本文介绍一下HaaS600如何使用轻应用来开发. ...
- 百为STM32开发板教程之十二——NAND FLASH
参考资料: 百为stm32开发板光盘V3\百为stm32开发板光盘\芯片数据手册\K9F1208.pdf 百为stm32开发板光盘\st官方参考资料\Application notes\AN2784 ...
- 阿里云HaaS100物联网开发板学习笔记(六)做个智能灯---一个完整的开发例子
摘要:本篇文章将前期几个专题综合起来,基于阿里云HaaS100的新固件设计制作一个智能灯.这个智能灯由云平台.手机APP端和设备端组成,基本上涵盖了一个物联网小项目所需的主要步骤. 目录 1.在阿里云 ...
- 阿里云HaaS100物联网开发板学习笔记(三)轻应用初步--用js让小灯闪烁起来
摘要:能让JavaScript应用运行在haas100开发板上,这实在是太酷了,这种方式被阿里云称之为"轻应用".本文带各位从零开始,先了解啥是轻应用,然后搭建环境,再一步步将一个 ...
最新文章
- Luogu 4438 [HNOI/AHOI2018]道路
- 别再被 Python 洗脑了!!
- Asp.net下web.config或是bin中的dll有变更后,重启的问题
- 二进制异或--7.18待完善
- windows mongdb 安装
- 一个由正则表达式引发的血案
- Composer学习之————Ubuntu14.04下安装Composer
- Centos服务器查看当前的并发数
- Python使用装饰器和线程限制函数执行时间的方法
- Facebook 开源 3D 深度学习函数库 PyTorch3D,也可用于二维场景
- [HTA] - HTML应用程序
- 两种云原生技术在弹性计算的使用、原理和思考
- oracle的备份恢复命令,Oracle RMAN的备份与恢复命令详解
- python安装pygame的命令是什么_Python的pygame安装教程详解
- 信号的时频分析MATLAB,基于matlab的信号时频分析仿真
- Qt 5.2.1 applications (32 bit) in CentOS (64 bit with gcc 4.8.2)
- UVA11105 H-半素数 Semi-prime H-numbers(线性筛+前缀和+暴力)
- 程序员从来没给丈母娘买礼物,真相竟然令人沉默
- Docker中ubuntu镜像安装ps显示进程
- PostgreSQL-Docker创建PostgreSQL数据库并导入矢量数据
热门文章
- html打开无法显示网页怎么回事,Win7打开网页提示“Internet Explorer无法显示该页面”如何解决?...
- JS实现简单的登录注册页签
- 2012年华为杯校园编程大赛决赛 类别:软件C/C++语言
- 如何使用Kotlin构建Android旋转旋钮以帮助儿子练习钢琴
- STM32Cube工具学习笔记(一)Cube配置
- 同居mm_倾向于同居
- Debian 11 修改 DNS 服务器
- 构建面向未来的前端架构
- RTL8197F/RTL8812F WiFi设置为WPA3加密手机提示拒绝连接问题解决方案
- 挂耳式蓝牙耳机哪家的好用,推荐几款实用的挂耳式耳机