当前位置: 首页 > 知识库问答 >
问题:

使用带有v4l2插件、ffmpeg或gstream er的obs将静态图像流式传输到v4l2环回

戚奇略
2023-03-14

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

obs:我在这里按照这个教程安装了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,并输出1920x108o。在插件中,我选择NV12作为视频格式,选择/dev/video2作为V4L2设备。图像已成功发送到模拟器,但分辨率错误。使用ffplay,我得到以下信息:

"输入#0, Video4linux2, v4l2, from'/dev/Video2': B sq=0Bf=0/0持续时间:N/A,开始:1650.347834,比特率:27648 kb/s Stream#0:0: Video: rawvideo(NV12/0x3231564E), nv12,320x240,27648 kb/s,30 fps,30 tbr,1000ktbn,1000ktbc"

看起来,分辨率缩小到了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:Gstreamer只有在modprobe之后我不使用以下命令时才起作用(如果我使用它,则GStreamers的管道被阻塞):

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

共有1个答案

苏德容
2023-03-14

我刚刚用Android Studio模拟器API 28 (Google X86_ARM)试了一下,效果不错。所以看起来和模拟器的CPU架构有关,x86 64不行。不过我需要arm,谢天谢地,谷歌在Api 28中为一张图片添加了Arm翻译。

似乎只有分辨率为1920x1080的图像才能工作,但也许它只与比例有关。

Obs由于某种原因现在不起作用,但此命令可以完美运行:ffmpeg-cle 1-re-ilicensePlate2.png-f v4l2-vcodec rawvideo-Pixfmt nv12-vf转置=4 /dev/video2

 类似资料:
  • 我正在为Raspbian(Raspberry Pi 2)中的Python编写视频捕获脚本,我在使用v4l2的Python绑定时遇到了麻烦,因为我在内存映射缓冲区方面没有成功。 我所需要的: 从高清网络摄像头捕获视频(稍后将同时捕获其中两个) 我所尝试的: 使用OpenCV(cv2)。它很容易使用,但是它增加了很多处理负载,因为它将网络摄像头的JPEG帧转换为原始图像,然后我必须在通过WLAN发送它

  • 对于我正在进行的计算机视觉项目,我需要使用Logitech C920网络摄像头抓取图像。我使用OpenCV的视频捕获来实现这一点,但我面临的问题是,我在某个时刻拍摄的图像没有显示相机看到的最新情况。也就是说,如果我在时间戳t处拍摄一张图像,它显示了相机在时间戳(t-delta)处看到的东西,也就是说。 为此,我编写了一个程序,使计数器递增并在屏幕上显示。我把相机对准屏幕,让它录下来。当计数器达到某

  • null null 但问题是我想以编程的方式完成这个任务。 我实际上想做的是: 步骤 但正如我所提到的,Firefox对MKV说不。 所以我尝试了hls的东西,但我不能完全得到命令来生成流,也不能在飞行中播放。 我是在命令行上开始的 所以我想再做一次 我要请求服务器播放视频文件 它生成一个子进程FFmpeg,该进程执行代码转换 向客户端发送流 客户端应该能够搜索到底,并且应该播放该内容。

  • 我使用命令行中的v4l2 ctl来更改usb摄像头的曝光值,但当我使用时,我无法更改内置网络摄像头中的设备-它没有给出错误,但根本不做任何操作

  • 我试图在两个进程之间共享从USB摄像头(logitech c270)接收到的帧(图像),以便避免出现。我正在使用这里描述的内存映射流式I/O方法,在使用后,我可以成功地从相机获取帧。但是,我有另一个进程(用于图像处理),它必须在出列后使用图像缓冲区,并向第一个进程发出信号,再次对缓冲区进行排队。 在网上搜索,我可以发现打开视频设备多次是允许的,但是当我尝试映射(尝试两个和只是)在第二个过程后成功的

  • 我有一个图像,我想覆盖在地图上的特定位置,看起来像当前静态地图图像服务没有提供任何参数传递。