17. 11. 2010

Konverze videa pro PS3

Máme doma rodinný fotoaparát Canon PowerShot SX200 IS, který umí natáčet video v rozlišení 1280×720, tedy v HD ready, dá-li se to tak říct. Video z něj je velmi pěkné, ale je velmi slabě komprimované (pochopitelně, foťák nemá výkon na nějakou solidní kompresi v reálném čase), takže bitový tok videa se pohybuje kolem 25 000 kb/s. To je hodně, na 2GB kartu se vejde zhruba 10 minut záznamu. Srovnejte s dvouhodinovým filmem, který se vejde na 4 GB DVD. A navíc fotoaparát video ukládá do formátu QuickTime (*.mov), který nepodporuje konzole PlayStation 3. Tuto používám jako multimediální centrum a pomocí které bych chtěl video přehrávat ze síťového disku na televizi. To jsou hned dva důvody, proč chtít překonvertovat nějaké video.


Mé požadavky na konverzi videa jsou tři. Aby video zůstalo v té samé kvalitě, tedy stejné rozlišení, stejná obrazová kvalita, aby bylo co nejmenší a aby to šlo udělat v linuxu. Co mi naopak nevadí je, jak dlouho se to bude komprimovat. Vybral jsem si proto formát videa *.mp4 s kompresí videa H.264 a kompresí zvuku AAC (vše dle standardu MPEG-4).

Poohlížel jsem se po nějakém vhodném nástroji, který mi video do tohoto formátu zkonvertuje a nakonec jsem se rozhodl pro ffmpeg. To je program pro konverzi videa, který se ovládá z příkazové řádky. Je zdarma a docela kvalitní. I ve windows ho používá mnoho jiných konventorů, které v podstatě k ffmpeg poskytují pouze více čí méně omezující grafické uživatelské rozhraní. Práce s příkazovou řádkou mi není cizí a navíc mi to umožní jednoduše zkonvertovat všechna videa, která se mi už nashromáždila a připsat si skripty pro Nautilus, abych mohl další videa konvertovat pohodlně ze správce souborů.

Situace se mi trochu zkomplikovala tím, že ffmpeg v Ubuntu 10.04 nepodporuje AAC, proto jsem si musel přidat repozitář Mediabuntu a aktualizovat z něj ffmpeg. Jak na to se píše jinde [1]. Ve stručnosti jak na to pomocí příkazového řádku:

Spusťte editor:
gksudo gedit /etc/apt/sources.list
A doplňte řádek:
deb http://packages.medibuntu.org/ lucid free non-free

Pak dejte tyto příkazy:
sudo apt-get update
    sudo apt-get install medibuntu-keyring
    sudo apt-get install libavcodec-extra-52 libavcodec-unstripped-52 

Poté jsem musel nalézt vhodné parametry, jak z ffmpeg vymačkat ty nejlepší výsledky, protože komprimace videa je hodně odborné a složité téma. Po dlouhém pátrání jsem zjistil, že je to vlastně dost jednoduché, protože součástí ffmpeg jsou předvolená nastavení, která předpokládám připravili odborníci na slov vzatí. Více se o tom dočtete zde [2].

Výsledkem tohoto pátrání je příkaz, který se ve skutečnosti píše do jednoho dlouhého řádku, kde XXX představuje název originálního videa, které chci překonvertovat:

ffmpeg -i XXX
       -acodec libfaac -ac 2 -ab 192k 
       -vcodec libx264 -vpre libx264-hq -crf 20 
       -threads 0 
       XXX.mp4

Já jsem tento příkaz dal do skriptu mov2ps3 a XXX jsem nahradil za "$1", takže příkazem:

sh mov2ps3 MVI_0021.MOV

dojde ke konverzi videa MVI_0021.MOV a nové video bude uloženo pod názvem MVI_0021.MOV.mp4.

Pokud někoho zajímá smysl příkazu, tak na prvním řádku se zadává, které video se bude konvertovat.

Na druhém řádku se určují parametry zvukové stopy, tedy konverze do formátu AAC za použití kodéru libfaac, počet zvukových stop je 2, tedy klasické stereo a jeho bitový tok 192 kb.

Na třetím řádku se určují parametry video stopy, tedy konverze do formátu H.264 za použití kodéru libx264. Parametry nastavující konverzi se mají vzít z přednastavení libx264-losseless_max, což představuje co nejúčinnější kompresi pro zadaný bitový tok nebo kvalitu. Já zadal konstantní (tedy zaručenou) kvalitu, kterou jsem zadal 20 a bitový tok se této kvalitě bude přizpůsobovat podle náročnosti obrazu ve videu. Hodnotu 20 jsem stanovil experimentálně. Při této hodnotě nevidím rozdíl mezi originálním a novým videem ani když zastavím a zkoumám obraz a přitom má nové video třetinovou až čtvrtinovou velikost.

Seznam přednastavení které jsou k dispozici na mém počítač (v adresáři /usr/share/ffmpeg):
  • libx264-default            (14126 kb/s,  28,5 s,  7356663 B)
  • libx264-hq                 (13081 kb/s,  41,5 s,  6816372 B)
  • libx264-ipod320
  • libx264-ipod640
  • libx264-lossless_fast      (16596 kb/s,  7,93 s,  8631521 B)
  • libx264-lossless_max       (15709 kb/s, 127,4 s,  8173540 B)
  • libx264-lossless_medium    (15219 kb/s,  14,0 s,  7920161 B)
  • libx264-lossless_slower    (15807 kb/s,  35,3 s,  8223930 B)
  • libx264-lossless_slow      (15652 kb/s,  23,7 s,  8144041 B)
  • libx264-lossless_ultrafast (22070 kb/s,   4,4 s, 11460083 B)
  • libx264-max                (12671 kb/s,  15,0 s,  6604599 B)
  • libx264-normal             (13246 kb/s,  16,6 s,  6901810 B)

Pozor, nepoužívejte max a lossless_max, protože ty PS3 neumí přehrát.

Jen pro zajímavost jsem otestoval jednotlivé předvolené nastavení na videu dlouhém 4,13 s, s datovým tokem 22691 kb/s v souboru velkém 12 687 461 B. V závorce jsou uvedeny parametry nového videa, přičemž čas informuje o době, po kterou komprimace probíhala. Rozdíly v kvalitě obrazu nedovedu rozpoznat i když by tam asi měli nějaké být, protože si jinak nedovedu vysvětlit, proč lossles_max má větší bitový tok, než videa komprimovaná mnohem kratší dobu.

Na čtvrtém řádku se nastavuje využití maximálního výkonu počítače. Hodnotou 1 by se video komprimovalo v 1 threadu, což by znamenalo, že by u dvoujádrového procesoru bylo zatíženo jen jedno jádro. To je vhodná volba pro ty, co komprimují na pozadí a chtěli by u počítače dělat i něco jiného náročného.

Na posledním řádku se určuje, jaký název má mít nový video soubor.

Žádné komentáře:

Okomentovat