[yocto] v4l2loopbackビルド方法

2022/10/10に公開

背景

  • imx yocto linux で GStreamer で v4l2sink を使おうとするとエラーになる。
  • 最新のカーネルにオーバーレイが入っているらしいが見つからなかった。
  • ググるとカーネルモジュールの umlaeute/v4l2loopback でやるそうだ。
  • imx レイヤーになかったので自前ビルドする。

Yocto レシピ

Yoctoレシピは v4l2loopback on Yocto を参考に作成。

SUMMARY = "V4L2Loopback"
DESCRIPTION = "v4l2loopback module"
LICENSE = "GPLv2"
LIC_FILES_CHKSUM = "file://${COMMON_LICENSE_DIR}/GPL-2.0;md5=801f80980d171dd6425610833a22dbe6"

SRC_URI = "git://github.com/umlaeute/v4l2loopback.git;protocol=https;branch=main"
S = "${WORKDIR}/git"

inherit module

export KERNEL_DIR="${KERNEL_SRC}"
MODULES_INSTALL_TARGET = "install"
RPROVIDES_${PN} += "kernel-module-v4l2loopback"

ビルドエラー対処

asm/tlbbatch.h: No such file or directory

asm/tlbbatch.h は x86 のものなので imx であるわけがない。

Makefile を見るとカーネルソースディレクトリが x86 になっているので、Yocto の KERNEL_SRC に変える。

レシピに export KERNEL_DIR="${KERNEL_SRC}" を追加する。

No rule to make target 'modules_install'

v4l2loopback on Yocto に書いてあるが、Makefile に modules_install ターゲットが存在しない。

デフォルト値は module.bbclassMODULES_INSTALL_TARGET ?= "modules_install" になっている。

レシピに MODULES_INSTALL_TARGET = "install" を追加する。

動作確認

v4l2loopback.ko を imx に持っていって以下を確認。

モジュール読み込み

insmod ./v4l2loopback.ko

lsmod で存在確認

v4l2sink を試す

insmod すると /dev/video4 が追加されたので、これに videotestsrc を書き込む。で、video4 を RTSP 配信する。VLC で RTSP アクセスして表示できれば OK。

gst-launch-1.0 videotestsrc ! v4l2sink device=/dev/video4
gst-variable-rtsp-server -u "v4l2src device=/dev/video4 ! vpuenc_vp8 ! rtpvp8pay name=pay0"

参考

GitHubで編集を提案

Discussion