Używanie pulpitu jako fałszywej kamery internetowej w systemie Linux

47

Chcę utworzyć transmisję na żywo z (mojego okna) pulpitu linuksowego za pomocą bezpłatnego serwisu streamingowego, wykorzystując przechwycone wideo jako fałszywą kamerę internetową. Istnieje wiele narzędzi do tego w systemie Windows. ffmpeg pozwala mi przechwytywać dane wejściowe w określonym oknie, ale nie mogę znaleźć sposobu na przesłanie wideo do fałszywego urządzenia w stylu kamery internetowej używanego przez flash.

Czy ktoś może polecić metodę (lub oprogramowanie) do wykonania tego?

bkconrad
źródło
Wszystko było okropne, aż do momentu, gdy powiedziałeś „fałszywe urządzenie w stylu kamery internetowej, z którego można korzystać za pomocą lampy błyskowej”.
Ignacio Vazquez-Abrams,
Nie jestem pewny co masz na myśli? Przez urządzenie w stylu kamery miałem na myśli fałszywy plik urządzenia / dev / videoN lub coś podobnego. Zakładam, że w ten sposób przechwycone wideo byłoby użyteczne przy użyciu lampy błyskowej.
bkconrad,
Dokładnie. To trudne.
Ignacio Vazquez-Abrams,

Odpowiedzi:

51

Możesz zainstalować v4l2loopback . Jest to moduł jądra, który symuluje kamerę internetową. Załaduj:

modprobe v4l2loopback

Następnie musisz wysłać strumień wideo do urządzenia / dev / video0 za pomocą programu takiego jak ffmpeg. Aby przechwycić pulpit i przesłać go do / dev / video0 za pomocą ffmpeg, możesz użyć następującego wiersza poleceń:

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

Zmień wartość -r z 15 na coś innego, jeśli chcesz mieć inną częstotliwość klatek. Rozdzielczość jest wybierana w parametrze -s. Jeśli chcesz określić odsunięcie od lewego górnego rogu ekranu, podaj go w parametrze -i w postaci „-i: 0,0 + x, y”, gdzie x i y oznaczają odpowiednio przesunięcie w poziomie i pionie.

Víctor Fernández
źródło
5
Twój obraz może być dublowany, mam na myśli uzyskanie poziomego obrócenia w zależności od kompilacji ffmpeg . Użyj filtra wideo -vf hflip . Jeśli używasz już jednego vf, umieść je w cudzysłowie i oddziel je przecinkiem, na przykład -vf 'hflip, scale = 640: 360'.
Marcelo Teixeira Ruggeri
3
Dostaję kilka błędów z tym [x11grab @ 0x24013c0] Stream #0: not enough frames to estimate rate; consider increasing probesize, [v4l2 @ 0x2409520] ioctl(VIDIOC_G_FMT): Invalid argumentiCould not write header for output file #0 (incorrect codec parameters ?): Invalid argument
Lotus
1
Otrzymuję dokładnie takie same wyniki jak @Lotus z ffmpeg 3.1.4. Czy oprócz v4l2loopback i ffmpeg wymagane są jakieś specjalne kodeki lub pakiety?
cguenther
1
@Lotus Udało mi się obejść problem, gdy korzystam z innego urządzenia / dev / video. Powinieneś upewnić się, że używasz urządzenia wideo v4l2 (którym w moim przypadku jest / dev / video1). Przesunięcie może być spowodowane przez już istniejące prawdziwe urządzenie kamery internetowej korzystające z / dev / video0.
cguenther
2
@Lotus Upewnij się, że komenda modprobe (jako root lub sudo) została uruchomiona przed uruchomieniem przeglądarki Chrome. Sprawdź, czy moduł jest poprawnie załadowany za pomocą <code> lsmod | grep v4l2loopback </code>.
cguenther
6

Używaj v4l2loopback z mplayerem .

  1. Pobierz to,
  2. skompiluj to ( makei su -c 'make install'),
  3. załaduj moduł su -c 'modprobe v4l2loopback',
  4. następnie zmień jeden wiersz w pliku examples/yuv4mpeg_to_v4l2.cfolderu źródłowego v4l2loopback z

    v.fmt.pix.pixelformat = V4L2_PIX_FMT_YUV420;
    

    do

    v.fmt.pix.pixelformat = V4L2_PIX_FMT_YVU420;
    
  5. i zrób makew tym folderze.

  6. Następnie uruchom go z exampleskatalogu w następujący sposób:

    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
    

    gdzie zastępujesz movie.mp4nazwą pliku wideo. I zamień /dev/video0na urządzenie z pętlą zwrotną.

MPlayer może odtwarzać dowolne strumienie internetowe, wszelkiego rodzaju pliki wideo, nawet ze standardowego wejścia! Właśnie przetestowałem go z plikiem z http://www.tagesschau.de, który jest niemieckim portalem z wiadomościami.

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

Zamiast $ TS możesz umieścić -(co oznacza standard). A przed mplayerem polecenie ffmpeg przekierowuje wyjście na standardowe wyjście. Więc coś takiego:

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

Nie przetestowałem ostatniego, ponieważ nie powiedziałeś, jak wygląda twoje polecenie ffmpeg.

erik
źródło
Proszę o pomoc: ./yuv4mpeg_to_v4l2 < /dev/video0 &prowadzi do ./yuv4mpeg_to_v4l2: : missing YUV4MPEG2 header. Jak zastąpić /tmp/pipeprzez /dev/video0?
user123456
3

Jakiej dystrybucji używasz? Odniosłem sukces z WebCamStudio pod Archem w połączeniu z internetowym „studiem” opartym na Livestream. Minęło trochę czasu, odkąd go użyłem.

http://www.ws4gl.org/

Co dokładnie próbujesz zrobić? ffmpeg skompilowany z x11grab może nagrywać pulpit. Odniosłem ograniczony sukces, przekazując to Ustream, ale znowu minęło trochę czasu i myślę, że to, co robiłem, już nie zadziała.

Jeśli chcesz po prostu przesyłać strumieniowo plik zamiast pulpitu (myślę, że kiedy mówisz „okno”, masz na myśli „VLC”), mogę skierować cię w dobrym kierunku, aby uzyskać pracę z Livestream (może Ustream). Niezdarnie zastanawiam się, jak to zrobić poprzez eksperymenty. To nie jest fantastyczne, ale działa z Livestream.

Justin.tv ma również skrypty, które mogą przesyłać strumieniowo z VLC do ich usług.

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

Mike Mitchell
źródło
Och, wow, to jest bardzo interesujące. Próbuję transmitować rozgrywkę na żywo niektórych gier. Wiem już, jak przechwytywać do pliku wideo z ffmpeg, zastanawiam się, czy mogę otworzyć ten sam plik w VLC i jakoś przesłać go strumieniowo podczas pisania. Dzięki za informację.
bkconrad
Witryna ws4gl.org wydaje się bardzo przestarzała, a wszystkie linki wskazują na Wayback Machine. Przypuszczam, że najnowsza wersja jest dostępna na sourceforge.net/projects/webcamstudio
Denilson Sá Maia
„WEBCAMSTUDIO JUŻ NIE UTRZYMUJE SIĘ”: /
Raphael
2

Po pierwsze, look.in prawdopodobnie robi to, co chcesz bez żadnych problemów (nie jestem powiązany): http://appear.in/

Po drugie, możesz przesyłać strumieniowo do Twitcha lub innych usług za pomocą OBS, który niedawno dodał obsługę linuksa (!): Https://obsproject.com/

OBS rozwiązuje również znacznie trudniejszy problem z dźwiękiem i wejściami audio systemu multipleksowania podczas przechwytywania ekranu na Ubuntu (nie rozwiązany przez nic w universerepozytorium, które do tej pory znalazłem).

Nie mam żadnych niesamowitych rozwiązań unix-y. Ale te działały dla mnie w prawdziwym świecie.

bkconrad
źródło
OBS Studio na Debianie: tracker.debian.org/pkg/obs-studio
myrdd