Petalinux工程中如何编译安装V4L2loopback kernel module

作者: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_,然后在rootfs menuconfig里就可以enable这个user module。但是petalinux没有V4L2loopback相关的recipe,需要我们手动添加到petalinux project里。具体方法就是把recipe文件v4l2loopback.bb拷贝到project-spec/meta-user/recipes-core/packagegroups/里,下面是测试过可用的recipe例子,这个recipe对应v4l2loopback v0.12.7版本。

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里使用它。

最新文章