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


47

我想使用一个免费的流媒体站点,将捕获的视频用作假冒的网络摄像头,对linux桌面(窗口上)进行实时流传输。Windows上有许多用于此目的的工具。ffmpeg允许我在特定窗口上捕获输入,但是我找不到将视频输出到可通过Flash使用的假冒网络摄像头式设备的方法。

谁能推荐这样做的方法(或软件)?


直到您说“伪造的摄像头式设备可通过闪存使用”,这一切都是笨拙的。
Ignacio Vazquez-Abrams

我不确定你是什么意思?“网络摄像头式”设备的意思是类似假的/ dev / videoN设备文件或类似的文件。我假设这是捕获的视频可以通过Flash使用的方式。
bkconrad

究竟。辛苦了
Ignacio Vazquez-Abrams

Answers:


51

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

modprobe v4l2loopback

然后,您需要使用类似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

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


5
您的图像可能是镜像的,我的意思是根据您的ffmpeg 版本进行水平翻转。使用视频过滤器-vf hflip。如果您已经使用过一个vf,请将其放在引号中并用逗号分隔,例如-vf'hflip,scale = 640:360'。
Marcelo Teixeira Ruggeri,2015年

3
我得到了一些错误与此[x11grab @ 0x24013c0] Stream #0: not enough frames to estimate rate; consider increasing probesize[v4l2 @ 0x2409520] ioctl(VIDIOC_G_FMT): Invalid argumentCould not write header for output file #0 (incorrect codec parameters ?): Invalid argument
莲花

1
我在ffmpeg 3.1.4中获得了与@Lotus完全相同的输出。v4l2loopback和ffmpeg旁边是否需要任何特殊的编解码器或软件包?
cguenther

1
@Lotus当我使用另一个/ dev / video设备时,我设法解决了这个问题。您应该确保使用v4l2视频设备(在我的情况下为/ dev / video1)。该偏移可能是由使用/ dev / video0的现有真实网络摄像头设备引起的。
cguenther

2
@Lotus在启动Chrome浏览器之前,请确保已运行modprobe命令(以root或sudo身份)。使用<code> lsmod |检查模块是否正确加载。grep v4l2loopback </ code>。
cguenther '16

6

v4l2loopback与mplayer一起使用

  1. 下载它,
  2. 编译(makesu -c 'make install'),
  3. 加载与所述模块su -c 'modprobe v4l2loopback'
  4. 然后从以下位置更改examples/yuv4mpeg_to_v4l2.cv4l2loopback源文件夹的文件中的一行

    v.fmt.pix.pixelformat = V4L2_PIX_FMT_YUV420;
    

    v.fmt.pix.pixelformat = V4L2_PIX_FMT_YVU420;
    
  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
    

    在其中替换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

代替$ TS,您可以放一个-(代表stdin)。在mplayer前面,您的ffmpeg命令将其输出重定向到stdout。所以像这样:

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

没有测试最后一个,因为您没有告诉您ffmpeg命令的外观。


请帮助:./yuv4mpeg_to_v4l2 < /dev/video0 &导致./yuv4mpeg_to_v4l2: : missing YUV4MPEG2 header。如何替换/tmp/pipe/dev/video0
user123456

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


哇,这很有趣。我正在尝试直播一些游戏的实时游戏玩法。我已经知道如何从ffmpeg捕获到视频文件中,我想知道是否可以在vlc中打开同一文件并在编写时以某种方式对其进行流处理。谢谢(你的)信息。
bkconrad

ws4gl.org网站似乎非常过时,并且所有链接都指向Wayback Machine。我想最新的版本可以在sourceforge.net/projects/webcamstudio上找到
DenilsonSáMaia'Feb 12'12

“不再需要维护WEBCAMSTUDIO”:/
拉斐尔

2

首先,appear.in可能会毫不费力地满足您的要求(与我无关):http ://appear.in/

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

OBS还解决了在Ubuntu上进行屏幕捕获时混合系统声音和音频输入的更艰巨的问题(universe到目前为止,我在仓库中找不到任何解决方案)。

我没有任何很棒的unix-y解决方案。但是那些在现实世界中为我工作。


OBS工作室在Debian:tracker.debian.org/pkg/obs-studio
myrdd
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.