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