在 linux 上使用桌面作为假网络摄像头

bkc*_*rad 78 linux ffmpeg screencasts virtual-webcam

我想使用免费的流媒体网站制作我的 linux 桌面的(窗口上的)实时流,使用捕获的视频作为假网络摄像头。Windows 上有很多工具可以做到这一点。ffmpeg 允许我捕获特定窗口上的输入,但我找不到将视频输出到可由 flash 使用的假网络摄像头式设备的方法。

任何人都可以推荐一种方法(或软件)来执行此操作吗?

小智 87

您可以安装v4l2loopback。它是一个模拟网络摄像头的内核模块。加载它:

modprobe v4l2loopback
Run Code Online (Sandbox Code Playgroud)

然后,您需要使用 ffmpeg 之类的程序将视频流发送到设备 /dev/video0。为了捕获桌面并使用 ffmpeg 将其转发到 /dev/video0,您可以使用以下命令行:

ffmpeg -f x11grab -r 15 -s 1280x720 -i :0.0+0,0 -vcodec rawvideo -pix_fmt yuv420p -threads 0 -f v4l2 /dev/video0
Run Code Online (Sandbox Code Playgroud)

如果您想要不同的帧速率,请将 -r 的值从 15 更改为其他值。在 -s 参数中选择分辨率。如果要指定距屏幕左上角的偏移量,请以“-i :0.0+x,y”形式将其传递到 -i 参数中,其中 x 和 y 分别是水平和垂直偏移量。

  • 您的图像可能被镜像,我的意思是根据您的 ffmpeg **build** 获得 **水平翻转**。使用视频过滤器**-vf hflip**。如果您已经使用了一个 vf,请将它们放在引号内并用逗号分隔,例如 -vf 'hflip,scale=640:360'。 (9认同)
  • 我在这个 `[x11grab @ 0x24013c0] Stream #0: 没有足够的帧来估计速率时遇到一些错误;考虑增加probesize`、`[v4l2 @ 0x2409520] ioctl(VIDIOC_G_FMT): Invalid argument` 和`Could not write header for output file #0 (不正确的编解码器参数?): Invalid argument ` (5认同)
  • @Lotus 当我使用另一个 /dev/video 设备时,我设法解决了这个问题。您应该确保使用 v4l2 视频设备(在我的情况下是 /dev/video1)。偏移量可能是由使用 /dev/video0 的已经存在的真实网络摄像头设备引起的。 (3认同)
  • @Lotus 确保在启动 Chrome 浏览器之前已运行 modprobe 命令(以 root 或使用 sudo)。使用 <code>lsmod | 检查模块是否正确加载 grep v4l2loopback</code>。 (2认同)

eri*_*rik 10

v4l2loopback 与 mplayer 一起使用

  1. 下载它,
  2. 编译它(makesu -c 'make install'),
  3. 加载模块su -c 'modprobe v4l2loopback'
  4. 然后examples/yuv4mpeg_to_v4l2.c将 v4l2loopback 源文件夹的文件中的一行从

    v.fmt.pix.pixelformat = V4L2_PIX_FMT_YUV420;
    
    Run Code Online (Sandbox Code Playgroud)

    v.fmt.pix.pixelformat = V4L2_PIX_FMT_YVU420;
    
    Run Code Online (Sandbox Code Playgroud)
  5. make在此文件夹中执行。

  6. 然后examples像这样从目录运行它:

    mkfifo /tmp/pipe  # only needed once, as long as you do not delete the file /tmp/pipe
    ./yuv4mpeg_to_v4l2 < /tmp/pipe &
    mplayer movie.mp4 -vf scale=480:360 -vo yuv4mpeg:file=/tmp/pipe
    
    Run Code Online (Sandbox Code Playgroud)

    movie.mp4可以在其中替换为视频文件的名称。并替换/dev/video0为您的环回设备。

MPlayer 能够播放任何网络流、所有类型的视频文件,甚至来自标准输入!我刚刚使用来自德国新闻网站http://www.tagesschau.de的文件对其进行了测试。

TS=$(wget "http://www.tagesschau.de/multimedia/video/" -q -O - | grep --regexp='http.*\.webm"' | sed -e 's%.*href="%%' -e 's%\.webm".*%\.webm%')
./yuv4mpeg_to_v4l2 < /tmp/pipe &
mplayer $TS -vf scale=480:360 -vo yuv4mpeg:file=/tmp/pipe
Run Code Online (Sandbox Code Playgroud)

您可以放置​​一个-(代表标准输入)而不是 $TS 。在 mplayer 前面,您的 ffmpeg 命令将其输出重定向到标准输出。所以像:

./yuv4mpeg_to_v4l2 < /tmp/pipe &
fmpeg -someOptions ... -o - | mplayer - -vf scale=480:360 -vo yuv4mpeg:file=/tmp/pipe
Run Code Online (Sandbox Code Playgroud)

没有测试最后一个,因为你没有告诉你的 ffmpeg 命令是什么样的。


小智 4

你使用什么发行版?我通过 Arch 下的 WebCamStudio 与基于网络的 Livestream“工作室”的结合取得了成功。不过,自从我使用它以来已经有一段时间了。

http://www.ws4gl.org/

你到底想做什么?用x11grab编译的ffmpeg可以记录桌面。我在将其推向 Ustream 方面取得了有限的成功,但同样已经有一段时间了,我认为我所做的事情将不再有效。

如果您只想流式传输文件而不是桌面(我在想,当您说“窗口”时,您的意思是“VLC”),我可以为您指出正确的方向,以使其与 Livestream 一起使用(也许乌流)。我正在笨拙地弄清楚如何通过实验来做到这一点。这不是太棒了,但它可以与 Livestream 配合使用。

Justin.tv 也有可以从 VLC 流式传输到其服务的脚本。

http://apiwiki.justin.tv/mediawiki/index.php/Linux_Broadcasting_API