如何在 Linux 上将我的桌面/屏幕作为(假)“网络摄像头”流式传输到 /dev/video1?

Chi*_*uop 10 linux streaming ffmpeg video-editing gstreamer

我有两个命令,一个让我将屏幕录制到 AVI 视频文件,另一个让我将视频文件作为(假)“网络摄像头”流式传输。这在不支持选择一个屏幕进行共享的应用程序中非常有用(我正在看你 Slack)。

命令#1(https://askubuntu.com/a/892683/721238):

ffmpeg -y -f alsa -i hw:0 -f x11grab -framerate 30 -video_size 1920x1080 -i :0.0+1920,0 -c:v libx264 -pix_fmt yuv420p -qp 0 -preset ultrafast screenStream.avi

命令#2(https://unix.stackexchange.com/a/466683/253391):

ffmpeg -re -i screenStream.avi -map 0:v -f v4l2 /dev/video1

为什么我不能同时运行这两个?好吧,每当我使用“网络摄像头”时,第二个命令都会从文件的开头开始流式传输。所以我必须把时间安排得非常接近,否则会有延迟。

我已经尝试了很多解决方案(包括使用 gstreamer 而不是 ffmpeg 的解决方案),但没有任何效果。这是我最后的希望。

如何在 Ubuntu 上将我的桌面/屏幕作为(假)“网络摄像头”流式传输到 /dev/video1?

Chi*_*uop 11

解决了。

解决步骤:

  1. 卸载之前的 v4l2loopback sudo modprobe -r v4l2loopback
  2. git clone https://github.com/umlaeute/v4l2loopback/
  3. make && sudo make install(如果您使用的是安全启动,则需要先对其进行签名https://ubuntu.com/blog/how-to-sign-things-for-secure-boot
  4. sudo depmod -a
  5. 加载 videodev 驱动程序 sudo modprobe videodev
  6. sudo insmod ./v4l2loopback.ko devices=1 video_nr=2 exclusive_caps=1根据您已有的摄像头数量更改video_nr。零索引
  7. ls -al /dev/video* 将 /dev/video[video_nr] 与 ffmpeg 一起使用
  8. sudo ffmpeg -f x11grab -r 60 -s 1920x1080 -i :0.0+1920,0 -vcodec rawvideo -pix_fmt yuv420p -threads 0 -f v4l2 -vf 'hflip,scale=640:360' /dev/video2
  9. 转到https://webcamtests.com并测试您的虚拟摄像头 虚拟凸轮
  10. 利润! 在职的

如果您希望这在两次引导之间持续存在,https://askubuntu.com/a/1024786/721238应该这样做。

  • 对我来说,没有必要从 github 下载,只需`sudo apt install v4l2loop*`。因为我使用的是通用模块,所以我只使用了 modprobe,其中答案使用了 insmod。除此之外,非常有用。我能够使用 `-stream_loop -1` 播放文件,就好像它是网络摄像头提要一样。 (3认同)
  • 在我的情况下(Ubuntu 18.04),问题是来自 repo 的旧 v4l2loop 版本,事实证明。这个答案解释了如何使用适用于我的发行版的最新 github 版本。非常感谢! (2认同)