【问题标题】:Stream static image to v4l2loopback using obs with v4l2 plugin, ffmpeg or gstreamer使用带有 v4l2 插件、ffmpeg 或 gstreamer 的 obs 将静态图像流式传输到 v4l2loopback
【发布时间】:2021-03-15 17:30:33
【问题描述】:

我想将静态图像流式传输到 android studio 模拟器。为此,我在 linux ubuntu 20.04 中使用 v4l2loopback v.12.5 创建了一个虚拟相机。 虚拟摄像机在 /dev/video2 中创建。我可以使用 obs 和插件、ffmpeg 或 gstreamer 在那里流式传输,但每个都有不同的问题。我不在乎哪个软件好用... 我总是使用分辨率为 1920x1080 的图像来测试它。

OBS: 我按照本教程 here 安装了 obs 插件。它解释了如何安装 v4l2loopback 并将插件添加到 obs。该插件名为 obs-v4l2sink。 我使用这个命令启动 v4l2loopback:

sudo modprobe v4l2loopback exclusive_caps=1 video_nr=2 card_label=virtualCam

然后:

v4l2loopback-ctl set-caps "video/x-raw, format=NV12, width=1920, height=1080" "/dev/video2"

然后我使用基本画布 1920x1080 启动 Obs,并输出 1920x1080。在插件中,我选择 NV12 作为视频格式,/dev/video2 作为 V4L2 设备。图像已成功发送到模拟器,但分辨率错误。使用 ffplay 我收到此消息:

"输入#0, video4linux2,v4l2, from '/dev/video2':B sq= 0B f=0/0 持续时间:N/A,开始:1650.347834,比特率:27648 kb/s 流 #0:0:视频:rawvideo (NV12 / 0x3231564E)、nv12、320x240、27648 kb/s、30 fps、30 tbr、1000k tbn、1000k tbc"

看来,分辨率缩小到 320x240,我不知道为什么。

ffmpeg: 我可以使用以下命令通过 ffmpeg 流式传输到 /dev/video2:

ffmpeg -re loop 1 -i licensePlate.png -f v4l2 /dev/video2 

但我在 ffplay 中只得到错误的像素,输出如下:

[video4linux2, v4l2 @ 0x7fb494000bc0] 出队的 v4l2 缓冲区包含 118784 字节,但预期为 115200。标志:0x00000001。

Gstreamer: 仅当我在 modprobe 之后不使用以下命令时,Gstreamer 才有效(如果我使用它,则管道被 Gstreamer 阻塞):

v4l2loopback-ctl set-caps "video/x-raw, format=NV12, width=1920, height=1080" "/dev/video2"

我改为调用这个命令:

gst-launch-1.0 -v multifilesrc location=licensePlate2.png loop=1 caps="image/png,framerate=10/1" ! pngdec ! videoscale ! videoconvert ! "video/x-raw,format=NV12,width=1920,height=1080" ! v4l2sink device=/-dev/video2

使用 ffplay 我看到了我想要的 1920x1080 图像,一切看起来都很好,但在 android studio 模拟器中我只得到一个奇怪的绿屏。我之前得到了这个绿屏,我认为它与错误的分辨率有关。我真的不知道这里有什么问题。模拟器多次显示这些日志:

emulator: ERROR: camera_device_start_capturing: Dimensions 0x0 are wrong for pixel format NV12
emulator: ERROR: _camera_client_start: Cannot start camera '/dev/video2' for NV12[0x0]: Inappropriate ioctl for device

我正在使用的 avd 是 Pixel2 1920x1080 Android 11 x86 64,我正在使用以下命令启动它:

./emulator -avd Pixel264 -camera-back webcam1 -no-snapshot
Pixel264 is my avd and webcam1 is the virtual webcam, that is linked to /dev/video2

【问题讨论】:

  • 为什么需要拨打v4l2loopback-ctl set-caps?在您的情况下,我认为没有任何具体需要这样做。
  • 在我使用该命令之前,我所看到的只是绿屏。显示这些绿屏是因为我认为分辨率存在问题。一旦我将分辨率配置为 hd,所有 obs 开始工作。

标签: linux android-emulator android-camera v4l2loopback obs


【解决方案1】:

我刚刚使用 Android Studio Emulator API 28 (Google X86_ARM) 进行了尝试,它可以工作。所以似乎与模拟器的CPU架构有关,x86 64不起作用。不过我需要 arm,谢天谢地,谷歌在 Api 28 中为图像添加了 Arm 翻译。

似乎只有分辨率为 1920x1080 的图像才有效,但可能只与比例有关。

由于某种原因,Obs 现在无法正常工作,但此命令可以正常工作: ffmpeg -loop 1 -re -i licensePlate2.png -f v4l2 -vcodec rawvideo -pixfmt nv12 -vf transpose=4 /dev/video2

【讨论】:

  • 很高兴您找到了解决方案。一旦你有足够的分数,考虑接受你自己的答案,所以问题被正确标记为已解决
猜你喜欢
  • 2020-08-01
  • 2022-04-04
  • 1970-01-01
  • 1970-01-01
  • 2019-06-10
  • 2022-06-23
  • 1970-01-01
  • 2011-11-22
  • 2021-10-03
相关资源
最近更新 更多