作者:Zhang Yong,AMD工程师;来源:AMD开发者社区
通常如果一个application正在访问某个video设备的时候,另外一个application访问它会返回busy状态。有时我们需要把同一个camera的图像显示到两台显示器上,基于blog “如何在zcu102板卡上创建DisplayPort 1.4 Tx Subsystem core的pipeline”里的PS-DP + PL-DP的平台,Xorg很难实现screen copy。一种可行方法是使用blog “Petalinux工程中如何编译安装V4L2loopback kernel module”里介绍的v4l2loopback虚拟摄像头来实现。
V4L2loopback生成的虚拟设备可以被多个application访问,从而实现同一组图像在多个video pipeline上显示。其中PS-DP pipeline可以使用blog “如何在petalinux环境下使用python脚本实现opencv显示USB camera图像”里的方法通过opencv + Xorg来显示,python脚本里需要将打开设备编号改为v4l2loopback虚拟设备的编号,即‘4’,另外一条PL-DP pipeline可以使用gstreamer来显示。
首先使用ffmpeg将camera设备/dev/video0的视频流传输到v4l2loopback虚拟设备/dev/video4,
ffmpeg -i /dev/video0 -nostdin -loglevel panic -f v4l2 -s 1920x1080 -codec:v rawvideo -pix_fmt yuv420p /dev/video4 > /dev/null &
因为camera来的视频流是yuv420p/I420/YU12格式,而我们在vivado工程和设备树里设置了video mixer core的primary plan是AR24/BGRA8格式,所以需要做一下格式转换。可以直接在gstreamer pipeline里做转换并显示,命令如下,
gst-launch-1.0 v4l2src device=/dev/video4 ! video/x-raw, format=I420 ! videoconvert ! video/x-raw, format=BGRA ! fpsdisplaysink name=fpssink video-sink="kmssink bus-id="a0010000.v_mix" plane-id=34" > /dev/null &
在petalinux环境下使用gst-launch-1.0需要在rootfs menuconfig里增加一些package。
gstreamer1.0
gstreamer1.0-dev
gstreamer1.0-omx
gst-player
gstreamer1.0-meta-base
gstreamer1.0-meta-video
gstreamer1.0-meta-x11-base-dev
gstreamer1.0-meta-x11-base
gstreamer1.0-meta-video-dev
gstreamer1.0-meta-base-dev
gstreamer1.0-plugins-bad
gstreamer1.0-plugins-bad-dev
gstreamer1.0-plugins-base
gstreamer1.0-plugins-base-apps
gstreamer1.0-plugins-base-dev
gstreamer1.0-plugins-good
gstreamer1.0-plugins-good-dev
另外PS-DP显示需要增加一些package和library
libdrm
libdrm-tests
libdrm-drivers
libmali-xlnx