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

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

我想使用免费的流媒体网站对我的 Linux 桌面上的窗口进行直播,并将捕获的视频用作虚假的网络摄像头。Windows 上有许多工具可用于此目的。ffmpeg 允许我捕获特定窗口上的输入,但我找不到将视频输出到 Flash 可使用的虚假网络摄像头式设备的方法。

有人可以推荐一种方法(或软件)来做到这一点吗?

答案1

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

modprobe v4l2loopback

然后,您需要使用 ffmpeg 之类的程序将视频流发送到设备/dev/videoN(其中N是与新创建的设备相对应的编号 - 可能是最高编号)。为了捕获桌面并将其转发到/dev/videoNffmpeg,您可以使用以下命令行:

ffmpeg -probesize 100M -framerate 15 -f x11grab -video_size 1280x720 -i :0.0+0,0 -vcodec rawvideo -pix_fmt yuv420p -f v4l2 /dev/videoN

-framerate如果您想要不同的帧速率,请将值从 15 更改为其他值。

分辨率在-video_size参数中选择。如果要指定与屏幕左上角的偏移量,请以 的形式在 -i 参数中传递-i :0.0+x,y,其中 x 和 y 分别是水平和垂直偏移量。

答案2

使用v4l2loopback 与 mplayer

  1. 下载它,

  2. 编译它(make并且su -c 'make install'),

  3. 使用以下方式加载模块su -c 'modprobe v4l2loopback'

  4. examples/yuv4mpeg_to_v4l2.c然后将v4l2loopback 源文件夹文件中的一行从

    v.fmt.pix.pixelformat = V4L2_PIX_FMT_YUV420;
    

    v.fmt.pix.pixelformat = V4L2_PIX_FMT_YVU420;
  1. make并在此文件夹中执行。

  2. 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
    

movie.mp4用视频文件的名称替换其中的内容。 并/dev/video0用环回设备替换其中的内容。

MPlayer 能够播放任何网络流、所有类型的视频文件,甚至来自 stdin!我刚刚用一个文件测试了它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

您可以放置​​一个(代表 stdin)来代替 $TS -。在 mplayer 前面放置 ffmpeg 命令,将其输出重定向到 stdout。因此类似于:

./yuv4mpeg_to_v4l2 < /tmp/pipe &
ffmpeg -someOptions ... -o - | mplayer - -vf scale=480:360 -vo yuv4mpeg:file=/tmp/pipe

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

答案3

你使用的是哪个发行版?我曾成功使用过 Arch 下的 WebCamStudio 和 Livestream 基于 Web 的“工作室”。不过,我已经有一段时间没用它了。

http://www.ws4gl.org/

你到底想做什么?使用 x11grab 编译的 ffmpeg 可以录制桌面。我将其推送到 Ustream 时取得了有限的成功,但时间已经过去了一段时间,我认为我所做的不再有效。

如果您只想传输文件而不是桌面(我想当您说“窗口”时,您指的是“VLC”),我可以为您指明正确的方向,以便使用 Livestream(也许是 Ustream)来实现这一点。我正在笨拙地通过实验弄清楚如何做到这一点。虽然不是特别好,但可以与 Livestream 配合使用。

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

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

答案4

首先,appear.in 可能会毫不费力地完成您想要做的事情(我没有附属关系):http://appear.in/

其次,您可以使用 OBS 流式传输到 Twitch 或其他服务,OBS 最近添加了 Linux 支持(!):https://obsproject.com/

universeOBS 还解决了在 Ubuntu 上进行屏幕捕获时混合系统声音和音频输入这一更困难的问题(到目前为止,我发现 repo中的任何内容都无法解决这个问题)。

我没有任何出色的 unix-y 解决方案。但这些在现实世界中对我有用。

相关内容