我们基于2004的gstreamer版本在1.16.2/1.16.3上,为了提高gstreamer的可用性,我们跟进了rk的补丁,这样gstreamer可以良好的运行在系统上,所以我们需要升级gstreamer到1.20上,然后提供1.20的测试命令
针对1.20.1的版本选择,我们需要根据ubuntu的发行release来进行跟进,这里跟进基于jammy上,所以是1.20.1。如下以gstreamer1.0-plugins-bad为示例
针对此,我们所有的代码溯源来自于
https://launchpad.net/ubuntu/
内的release源地址的gstreamer包,这个包的版本是1.20.1-1系列
为了使得这个版本能够合入rk的补丁,我们需要找到rk补丁地址如下:
https://github.com/JeffyCN/meta-rockchip/tree/master/recipes-multimedia/gstreamer
针对此,我们需要找到1.20.7的版本补丁来进行1.20.1的微调,如下:
对于补丁的批量合入,我们如下脚本:
for p in *.patch; do patch -p1 < $p done
这里需要留意的是,如果出现了rej,请格外小心,注意合入
如果出现了orig,则对照上下文,判断自动合入是否存在问题
对于上述包的升级,我们还需要针对依赖来进行依赖包的rebuild操作,这里来源仍是https://launchpad.net/ubuntu/
内的release源地址
根据ppa的本地构建,这里已经完成了构建,ppa地址如下:
https://dev.kylinos.cn/~tangfeng/+archive/kylin-desktop/gstreamer-rk-patch
具体包和依赖图示如下:
至此,gstreamer已经完全正常,我们只需要将源更新如下,即可升级1.20.1-1的gstreamer源码
deb http://ppa.launchpad.dev/tangfeng/gstreamer-rk-patch/kylin-desktop v101 main
我们良好的构建了gstreamer后,需要进行一系列的命令测试,如下:
为了支持kms,例如开机动画等操作,我们可以如下:
gst-launch-1.0 videotestsrc ! kmssink force-modesetting=true fullscreen=true
如有测试视频,可以如下:
gst-play-1.0 -q --no-interactive --audiosink=fakesink --videosink="kmssink force-modesetting=true fullscreen=true" /usr/local/test.mp4
简单的测试一个视频的命令如下:
gst-play-1.0 --flags=3 /usr/local/test.mp4
如果需要看到fps值,如下:
GST_DEBUG=fpsdisplaysink:7 gst-launch-1.0 uridecodebin uri=file:///usr/local/test.mp4 ! fpsdisplaysink video-sink="xvimagesink" text-overlay=false signal-fps-measurements=true
如果测试最大fps值,则如下:
GST_DEBUG=fpsdisplaysink:7 gst-launch-1.0 uridecodebin uri=file:///usr/local/test.mp4 ! fpsdisplaysink video-sink="fakesink" text-overlay=false signal-fps-measurements=true sync=false
测试isp摄像头,因为出图是NV12的,所以需要指定:
gst-launch-1.0 v4l2src device=/dev/video-camera0 ! video/x-raw,format=NV12,width=640,height=480,framerate=30/1 ! xvimagesink
测试usb摄像头,因为出图是mjpeg的,所以命令如下
gst-launch-1.0 v4l2src device=/dev/video0 ! image/jpeg ! jpegparse ! mppjpegdec ! xvimagesink sync=false
如果需要rkximagesink,如下:
GST_DEBUG=rkximagesink:2 gst-launch-1.0 uridecodebin uri=file:///usr/local/test.mp4 ! fpsdisplaysink video-sink="rkximagesink" text-overlay=false signal-fps-measurements=true
注意,如果使用rkximagesink,请内核提供良好的图层让其分配,否则会提示no window。