linux - 使用带有 v4l2 插件、ffmpeg 或 gstreamer 的 obs 将静态图像流式传输到 v4l2loopback

标签 linux android-emulator android-camera v4l2loopback obs

我想将静态图像流式传输到 android studio 模拟器。为此,我在 linux ubuntu 20.04 中使用 v4l2loopback v.12.5 创建了一个虚拟相机。
虚拟摄像机在/dev/video2 中创建。我可以使用 obs 和插件、ffmpeg 或 gstreamer 在那里流式传输,但每个问题都有不同的问题。我不在乎哪个软件有效...
我总是使用分辨率为 1920x1080 的图像来测试这个。
OBS:
我按照本教程安装了 obs 插件 here .它解释了如何安装 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"
然后我用基础 Canvas 1920x1080 开始 Obs 并输出 1920x1080。在插件中,我选择 NV12 作为视频格式,/dev/video2 作为 V4L2 设备。图像已成功发送到模拟器,但分辨率错误。使用 ffplay 我收到此消息:

"Input #0, video4linux2,v4l2, from '/dev/video2':B sq= 0B f=0/0 Duration: N/A, start: 1650.347834, bitrate: 27648 kb/s Stream #0:0: Video: 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] Dequeued v4l2 buffer contains 118784 bytes, but 115200 were expected. Flags: 0x00000001.


Gstreamer:
Gstreamer 仅在我在 modprobe 之后不使用以下命令时才有效(如果我使用它,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

最佳答案

我刚刚用 Android Studio Emulator API 28 (Google X86_ARM) 尝试过,它工作正常。所以好像跟模拟器的CPU Architecture有关,x86 64不行。不过我需要 arm,幸好 Google 在 Api 28 中为图像添加了 Arm 翻译。
似乎只有分辨率为 1920x1080 的图像才能工作,但也许这仅与比例有关。
由于某种原因,Obs 现在不起作用,但此命令完美运行:
ffmpeg -loop 1 -re -i licensePlate2.png -f v4l2 -vcodec rawvideo -pixfmt nv12 -vf transpose=4/dev/video2

关于linux - 使用带有 v4l2 插件、ffmpeg 或 gstreamer 的 obs 将静态图像流式传输到 v4l2loopback,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65130397/

相关文章:

Linux,大文本文件,从A行到B行剥离内容

北极狐升级后安卓模拟器无法启动,libvulkan.so : failed

java - 仅在模拟器上 fragment 的 onCreateView 中出现 NullPointerException

android - 谷歌地图显示在模拟器上,但不在设备上

android - 处理 Camera Intent 的方向变化

linux - 使用 mod_rewrite 在某些页面上从强制 SSL 切换回来时出现问题

linux - 如何停止服务器在 Django 中以守护进程模式运行?

linux - CakePHP 烘焙错误 : Database connection “Mysql” is missing, 或无法创建

android - 将捕获的图像保存在 SD 卡上的特定文件夹中

Android:通过相机拍摄照片后无法调用 onActivityResult() 方法