作者: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
【預約直播】
