Usando o desktop como webcam falsa no linux


47

Quero fazer uma transmissão ao vivo da (uma janela na) minha área de trabalho linux usando um site de streaming gratuito, usando o vídeo capturado como uma webcam falsa. Existem muitas ferramentas para isso no Windows. O ffmpeg permite capturar entrada em uma janela específica, mas não consigo encontrar uma maneira de enviar o vídeo para um dispositivo falso no estilo da webcam, utilizável por flash.

Alguém pode recomendar um método (ou software) para fazer isso?


Estava tudo bem até você dizer "dispositivo falso no estilo da webcam utilizável pelo flash".
Ignacio Vazquez-Abrams

Eu não tenho certeza do que você quer dizer? Por dispositivo "estilo webcam", quis dizer algo como um arquivo de dispositivo / dev / videoN falso ou algo semelhante. Suponho que é assim que o vídeo capturado seria utilizável por flash.
precisa saber é o seguinte

Exatamente. Isso é difícil.
Ignacio Vazquez-Abrams

Respostas:


51

Você pode instalar o v4l2loopback . É um módulo do kernel que simula uma webcam. Carregue-o com:

modprobe v4l2loopback

Então você precisa enviar o fluxo de vídeo para o dispositivo / dev / video0 usando um programa como o ffmpeg. Para capturar a área de trabalho e encaminhá-la para / dev / video0 com ffmpeg, você pode usar a seguinte linha de comando:

ffmpeg -f x11grab -r 15 -s 1280x720 -i :0.0+0,0 -vcodec rawvideo -pix_fmt yuv420p -threads 0 -f v4l2 /dev/video0

Altere o valor de -r de 15 para outra coisa, se desejar uma taxa de quadros diferente. A resolução é escolhida no parâmetro -s. Se você deseja especificar um deslocamento no canto superior esquerdo da tela, passe-o no parâmetro -i no formato "-i: 0,0 + x, y", onde x e y são o deslocamento horizontal e vertical, respectivamente.


5
Sua imagem pode ser espelhada, quero dizer, virar horizontal, dependendo da sua compilação ffmpeg . Use o filtro de vídeo -vf hflip . Se você já usa um vf, coloque-o entre aspas e separado por vírgula, como -vf 'hflip, scale = 640: 360'.
Marcelo Teixeira Ruggeri 29/07

3
Eu estou recebendo alguns erros com este [x11grab @ 0x24013c0] Stream #0: not enough frames to estimate rate; consider increasing probesize, [v4l2 @ 0x2409520] ioctl(VIDIOC_G_FMT): Invalid argumenteCould not write header for output file #0 (incorrect codec parameters ?): Invalid argument
Lotus

1
Estou recebendo exatamente as mesmas saídas que o @Lotus com o ffmpeg 3.1.4. Existem codecs ou pacotes especiais solicitados ao lado de v4l2loopback e ffmpeg?
cguenther

1
@Lotus Consegui contornar o problema quando uso outro dispositivo / dev / video. Você deve garantir o uso do dispositivo de vídeo v4l2 (que é, no meu caso, o / dev / video1). O deslocamento pode ser causado por um dispositivo de webcam real já existente usando o / dev / video0.
cguenther

2
@Lotus Verifique se o comando modprobe (como root ou com sudo) foi executado antes de iniciar o navegador Chrome. Verifique se o módulo está carregado corretamente com <code> lsmod | grep v4l2loopback </code>.
cguenther

6

Use v4l2loopback com mplayer .

  1. Baixe,
  2. compile ( makee su -c 'make install'),
  3. carregue o módulo com su -c 'modprobe v4l2loopback',
  4. altere uma linha no arquivo examples/yuv4mpeg_to_v4l2.cda pasta de origem v4l2loopback de

    v.fmt.pix.pixelformat = V4L2_PIX_FMT_YUV420;
    

    para

    v.fmt.pix.pixelformat = V4L2_PIX_FMT_YVU420;
    
  5. e faça makenesta pasta.

  6. Em seguida, execute-o no examplesdiretório assim:

    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
    

    onde você substitui movie.mp4pelo nome do seu arquivo de vídeo. E substitua /dev/video0pelo seu dispositivo de loopback.

O MPlayer é capaz de reproduzir qualquer fluxo da web, todos os tipos de arquivos de vídeo, mesmo do stdin! Acabei de testar com um arquivo de http://www.tagesschau.de, que é um site de notícias alemão.

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

Em vez do $ TS, você pode colocar um -(que significa stdin). E na frente do mplayer, seu comando ffmpeg redireciona sua saída para stdout. Então, algo como:

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

Não testou o último, porque você não contou como o seu comando ffmpeg se parece.


Por favor, ajude: ./yuv4mpeg_to_v4l2 < /dev/video0 &leva a ./yuv4mpeg_to_v4l2: : missing YUV4MPEG2 header. Como substituir /tmp/pipepor /dev/video0?
user123456

3

Que distro você está usando? Eu tive sucesso com o WebCamStudio sob Arch combinado com o "estúdio" baseado na Web da Livestream. Já faz um tempo desde que eu o usei.

http://www.ws4gl.org/

O que você está tentando fazer exatamente? O ffmpeg compilado com o x11grab pode gravar a área de trabalho. Tive um sucesso limitado ao enviar isso para a Ustream, mas novamente já faz um tempo e acho que o que estava fazendo não funcionaria mais.

Se você quiser apenas transmitir um arquivo em vez de sua área de trabalho (estou pensando quando você diz "Uma janela", você quer dizer "VLC"), posso apontar na direção certa para que isso funcione com o Livestream (talvez Ustream). Estou desajeitadamente descobrindo como fazer isso através da experimentação. Não é fantástico, mas funciona com o Livestream.

O Justin.tv também possui scripts que podem transmitir do VLC para seus serviços.

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


Oh uau, isso é muito interessante. Estou tentando transmitir a jogabilidade ao vivo de alguns jogos. Eu já sei como capturar em um arquivo de vídeo do ffmpeg, gostaria de saber se posso abrir o mesmo arquivo no vlc e de alguma forma transmiti-lo conforme ele está sendo escrito. Obrigado pela informação.
Bkconrad

O site ws4gl.org parece muito desatualizado e todos os links apontam para a Wayback Machine. Suponho que a versão mais recente esteja disponível em sourceforge.net/projects/webcamstudio
Denilson Sá Maia

"O WEBCAMSTUDIO NÃO É MAIS MANTIDO": /
Raphael

2

Primeiro, o appear.in provavelmente faz o que você quer sem problemas (não sou afiliado): http://appear.in/

Segundo, você pode transmitir para o Twitch ou outros serviços usando o OBS, que adicionou recentemente o suporte ao Linux (!): Https://obsproject.com/

O OBS também resolve o problema muito mais difícil de muxar a entrada de som e áudio do sistema durante a captura de tela no Ubuntu (não resolvida por nada no universerepositório que encontrei até agora).

Eu não tenho nenhuma solução unix-y incrível. Mas aqueles funcionaram para mim no mundo real.


OBS Studio no Debian: tracker.debian.org/pkg/obs-studio
myrdd
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.