Nahrávání ze SH-TV 

Klub Silicon Hill Studentské unie ČVUT je rozhádaný jako ještě nikdy předtím. Ti rozumnější pochopili, že kdo uteče, vyhraje, což s sebou nese pro uživatele poněkud nepříjemný důsledek mimo jiné v podobě nefunkčnosti automatického digitálního videorekordéru TVgrab. No co, konečně mě to donutilo dopracovat svůj vlastní systém nahrávání, který zde předkládám.

Předně jsem se rozhodl nevytvářet žádný velký moloch (to bych ani neuměl) a místo toho maximálně využít programy, které jsou v linuxu k dispozici. Takže pro vlastní plánování jsem použil démona atd:
$ at 12:35 2007-12-01
warning: commands will be executed using /bin/sh
at> vlcrec 11
at> <EOT>
job 105 at 2007-12-01 12:35
Jak je vidět, použití příkazu at je vcelku intuitivní. Důležité je si pamatovat, že příkazu at předáváme jako parametr vždy nejdřív čas a pak datum. Samozřejmě, pokud plánujeme na poslední chvíli (méně než 24 hodin předem), není třeba datum udávat. Program at automaticky uloží celé aktuální prostředí, včetně aktuálního pracovního adresáře, takže se o to nemusíme starat. Příkaz <EOT> vložíme stiskem Ctrl+D.

Teď k tomu, co se skrývá pod názvem vlcrec. Jde o následující skript:
#!/bin/bash

vlc -I rc --rc-fake-tty --rc-unix $1.sock udp://@239.194.10.$1 :demux=dump :demuxdump-file="`date '+%Y%m%d-%H%M-'`$1.ts"
Tento skript spustí vlc, naladí jej na adresu danou argumentem příkazového řádku, nechá celý příchozí datový tok ukládat do souboru, jehož jméno vytvoří z aktuálního data a času a adresy, ze které je ukládáno. Aby bylo možno nahrávání bezpečně zastavit, zavede se programu vlc ovládací rozhraní rc, kteréžto pro komunikaci otevře tzv. UNIX domain socket s názvem složeným z čísla kanálu a přípony .sock. Tuto cestu jsem zvolil jednak proto, abych nemusel řešit zabezpečení, jako v případě TCP/IP socketu, kde bych měl navíc problém, pokud by zvolený port byl již obsazen.

Když už se pořad nahrál, je záhodno nahrávání ukončit. Dřív jsem používal jednoduše killall vlc, což sice bez problému fungovalo (soubory MPEG-TS jsou složeny z buněk po 180 Bajtech, takže není problém s nějakými nevyprázdněnými buffery; navíc i tyto buffery se při standardním zabíjení vyprazdňují), ale mělo vedlejší efekty v podobě zabití všech instancí vlc, takže bylo obtížné nahrávat víc pořadů naráz. Pátral jsem v dokumentaci a zjistil, že nejjednodušší bude poslat příkaz quit právě přes rozhraní rc. Narazil jsem však na problém, že ačkoli UNIX domain socket je také soubor, prosté echo quit > socket nefunguje. Osvědčený netcat o UNIX socketech mlčel. Až jsem objevil socat, což je jěště univerzálnější propojovač čehokoli s čímkoli. Takže jsem vytvořil skript vlckill, kterému opět předám číslo programu, kterému chci ukončit nahrávání:
#!/bin/bash

echo quit | socat stdio unix-connect:$1.sock
O zpracování zaznamenaných pořadů jsem tu již psal v souvislosti s patchem na export českých titulků z ProjectX.


Podporuji Audiovizuální centrum studentů ČVUT
Ivo Danihelka 

Díky za pěknou ukázku použití Linuxových příkazů.
O tom socat jsem nevěděl.

Pro grabování UDP streamu doporučuji zvětšit v Linuxu limit na maximální UDP buffer per process. Standardně zkompilované VLC dokáže využít 2MB, ale např. na mém stroji byl max limit 128KB.
Viz.:

$ sysctl net.core.rmem_max


V /etc/sysctl.conf se to dá nastavit.
Hezký článek o UDP bufferu je zde:
http://www.29west.com/docs/THPM/udp-buffer-sizing.html

Komentáře

Pro tento záznam nejsou komentáře povoleny.