Motivací k tomuto článku bylo vytvořit řešení, které by umožňovalo prostřednictvím virtuálního video zařízení, tvářícího se jako webkamera, streamovat obsah ze souboru. Naším záměrem bylo opakovaně streamovat obsah webinářů, přičemž přednášející by zde byl pouze pro potřeby odpovídání dotazů a průběžnou komunikaci se studenty během přednášky. Dále uváděný postup se týká výhradně OS Linux.

Virtuální webkamera s v4l2loopback

v4l2loopback je jaderným modulem, který není standardní součástí Linuxových distribucí. Tento jaderný modul poskytuje funkce virtuální videokamery. Počet současně provozovaných virtuálních videokamer není omezený. My se v našem případě spokojíme s jediným zařízením.

Pokud V4l2loopback nenajdete v repozitářích své Linuxové distribuce, najdete jej na GitHubu https://github.com/umlaeute/v4l2loopback

Po provedení potřebného instalačního postupu je třeba zavést jaderný modul do jádra.

modprobe v4l2loopback exclusive_caps=1

Parametr exclusive_caps=1 zlepšuje kompatibilitu s aplikacemi jako je chrome /WebRTC. Změní se tím vlastnosti zařízení – virtuální videokamera bude indikovat svoje capabilities pouze jako OUTPUT a nikoliv jako CAPTURE/OUTPUT.

Streamování pouze videa

Pro streamování videa do virtuálního video zařízení použijeme ffmpeg. Základní konstrukce příkazu vypadá takto:

ffmpeg -re -i output.mp4 -s 1920x1080 -vcodec rawvideo -pix_fmt yuv420p -threads 0 -f v4l2 -vf 'scale=320x200' /dev/video1

Video stream se přenáší jako rawvideo. Lze tedy předpokládat velký datový tok mezi aplikací a virtuálním video zařízením Linuxového jádra. Parametr -s 1920×1080 určuje vstupní rozlišení. Budete-li později streamovat z dalších souborů, nesmí se tento parametr měnit. Parametr scale=320×200 určuje výstupní rozlišení (na vrstvě v4l2). V tomto rozlišení bude video distribuováno na internetu.

Jak pozastavit přehrávání ffmpeg

Nástroj ffmpeg není určen k použití jako přehrávač videa, ale používá se k nejrůznějším konverzím a úpravám video souborů, ke streamování, apod. Standardní funkce pro zastavení zde proto chybí. Přehrávání lze ale pozastavit šipkou doprava na klávesnici. Tato funkce má v ffmpeg svůj jiný specifický význam – odeslání příkazu odpovídajícím filtrům. Stisknutím šipky vpravo dochází ale také k pozastavení zpracování videa.

Streamování videa spolu s audiem

Rozhraní virtuální videokamery je určené pouze ke zpracování videa. Zvuk je třeba řešit odděleně. Zvuk budeme z ffmpeg posílat do roury. Na druhé straně této roury bude přehrávač aplay.

mkpipe afifo

ffmpeg -re -i output.mp4 -s 1920x1080 -vcodec rawvideo -pix_fmt yuv420p -threads 0 -map 0:a -f u16le -acodec pcm_s16le -ac 2 -ar 44100 /home/user/afifo -f v4l2 -vf 'scale=1920x1080' /dev/video1

aplay -f S16_LE -c2 -r44100 afifo

Nástroj ffmpeg bude tedy streamovat video v rozlišení 1920×1080 (na vstupu i na výstupu) a současně bude transkodovat zvuk s pomocí kodeku pcm_s16le. Video se bude posílat do virtuálního video zařízení /dev/video1 a zvuk do předem připravené roury na cestě /home/user/afifo.

Přehrávač aplay bude zpracovávat audio z této roury a bude jej přehrávat v rámci stroje na kterém je spuštěno.

Routování audia v Linuxu

Pojem routování nelze v tomto kontextu brát doslovně. Zvukový subsystém je ale v některých Linuxových distribucích přesložitělý. Může vyvstat problém s tím, že posluchač webináře vidí pouze obraz, ale nemá k dispozici zvuk. V takovém případě je třeba s pomocí nástroje pavucontrol (opensuse) vybrat správnou zvukovou kartu pro přehrávání audia.