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"
EndSection

Section "ServerFlags"
    Option "BlankTime"  "0"
    Option "StandbyTime"  "0"
    Option "SuspendTime"  "0"
    Option "OffTime"  "0"
EndSection

Section "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 converter
  Klass                    Filter/Converter/Video
  Description              Converts video from one colorspace to another
  Author                   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

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值