作者:Zhang Yong,AMD工程师;来源:AMD开发者社区
V4L2loopback module是基于GPLv2 license的开源代码,它可以创建多个虚拟video设备,而且一个虚拟设备可以被多条pipeline同时访问,这给v视频系统的研发调试带来了很大灵活性。Petalinux工具的架构基于yocto,所以kernel module的编译安装基于yocto recipe。Petalinux工具自带的一些recipe,但是不包含V4L2loopback。
通常要在rootfs里增加petalinux自带的某些module,需要在project-spec/meta-user/conf/user-rootfsconfig里增加CONFIG_
DESCRIPTION = "A kernel module to create V4L2 loopback devices"
LICENSE = "GPL-2.0-only"
LIC_FILES_CHKSUM = "file://COPYING;md5=b234ee4d69f5fce4486a80fdaf4a4263"
SRC_URI = "git://github.com/umlaeute/v4l2loopback.git;protocol=https;branch=main""
SRCREV = "1ecf810f0d687b647caa3050ae30cf51b5902afd"
S = "${WORKDIR}/git"
inherit module
STAGING_KERNEL_DIR = " /lib/modules/6.1.5-xilinx-v2023.1/build"
MODULES_INSTALL_TARGET = "install-all"
EXTRA_OEMAKE += "KERNEL_DIR=${STAGING_KERNEL_DIR}"
EXTRA_OEMAKE += "PREFIX=${D}${prefix}"
DEPENDS += "help2man-native"
PACKAGES += "${PN}-utils"
FILES:${PN}-utils = "${bindir}/v4l2loopback-ctl"
RDEPENDS:${PN}-utils += " \
gstreamer1.0 \
gstreamer1.0-plugins-base \
gstreamer1.0-plugins-good \
sudo \
v4l-utils \
"
V4L2loopback module的编译需要用到对应linux版本的kernel header files。我们可以在编译v4l2loopback之前,先运行一次petalinux-build来生成kernel headers。 具体方法是在project-spec/meta-user/conf/user-rootfsconfig里增加CONFIG_kernel-devsrc,project-spec/meta-user/conf/里增加INHERIT:remove = "rm_work",然后“petalinux-config -c rootfs”的menuconfig的user package里找到kernel-devsrc并mark yes,然后petalinux-build结束后就可以在image/linux里找到rootfs.tar.gz,把它copy到某个目录里然后解压,然后kernel headers就在lib/modules/6.1.5-xilinx-v2023.1/build里面。你需要在v4l2loopback.bb里把STAGING_KERNEL_DIR修改为你本地的kernel headers路径。
设置好kernel header之后就可以在user-rootfsconfig里增加CONFIG_v4l2loopback,并在rootfs menuconfig里enable v4l2loopback,最后就可以运行petalinux-build完成v4l2loopback kernel module compile&install。
板子上启动linux之后可以用sudo modprobe v4l2loopback exclusive_caps=1 video_nr=4命令生成/dev/video4这个虚拟camera设备,然后可以用ffmpeg把video stream从真实USB camera设备/dev/video0导入/dev/video4.
ffmpeg -i /dev/video0 -nostdin -loglevel panic -f v4l2 -s 1920x1080 -codec:v rawvideo -pix_fmt yuv420p /dev/video4 > /dev/null &
然后就可以使用/dev/video4这个设备了。需要说明一下,需要先导入视频流到虚拟视频设备,然后才能在application里使用它。