Odkedy sme prebrali skrachovaný portál Čeknito, naučil som sa dosť veľa o manipulácii s video súbormi. Niektoré užitočné poznatky sumarizujem v tomto článku.
Rýchly štart
Každý MP4 súbor sa skladá z viacerých sekcií. Tie si môžeme pozrieť týmto príkazom:
mediainfo file.mp4
Na pretáčanie v MP4 súbore slúži tzv. index. Doležité je, aby bol na začiatku MP4 súboru. Ak tam nebude, musí streamovací webserver otvoriť celý súbor, presunúť sa na index, aby ho mohol odservovať ako prvý. To je náročnejšie na zdroje ako keď sa nachádza index na priamo na začiatku súboru.
Presunúť index na začiatok súboru môžeme Python utilitou qtfaststart:
qtfaststart file.mp4
Konverzia GIF na AVI
Častokrát máme pekný animovaný GIF, ktorý by sme radi zverejnili ako video. Problém je, že ffmpeg ani avconv nevedia priamo animované GIFy konvertovať preto musíme najskôr vyextraktovať jednotlivé obrázky a následne ich spojiť dokopy.
convert -coalesce animated.gif frame%05d.png
Parameter -coalesce používame keď ide o GIF s transparentým pozadím.
Následne vyextrahované obrázky spojíme do výsledného videa:
ffmpeg -r 5 -qscale 1 -i frame%05d.png output.avi
Parameter -r 5 určuje prestávku (medzeru) medzi jednotlivými obrázkami. Čím menšie číslo, tym vačšia pauza.
Zmena ratio
Najskôr si zistíme aktuálne parametre videa:
mediainfo /storage/cekdata/vidsrc/_475656
Vo výstupe sa zameriame na toto:
Duration : 4mn 6s Bit rate mode : Variable Bit rate : 1 254 Kbps Maximum bit rate : 2 035 Kbps Width : 1 280 pixels Height : 496 pixels Display aspect ratio : 2.581
Vidíme, že 1280px / 2.581 = 496px. Keďže maximálne povolené aspect ratio je 1.78, musíme vypočítať novú výšku: 1280px / 1.78 = 719px
Teraz už len stačí prekonvertovať:
ffmpeg -i input.mp4 -acodec copy -vcodec mpeg4 -s 1280x719 -aspect 4:3 out.mp4
Zrýchlenie videa
Keď chceme video zrýchliť, musíme to osobitne spraviť pre video a audio. Ale je to možné aj jedným príkazom:
ffmpeg -i input.mov \ -filter_complex \ "[0:v]setpts=0.83*PTS[v];[0:a]atempo=1.2048[a]" -map "[v]" -map "[a]" \ -c:v libx264 -c:a libfaac output.mp4
Tie dve čísla 0.83 a 1.2048 musia byť v korelácii. Prvé zrýchľuje alebo spomaľuje video, druhé audio. Pre tieto čísla platí vzorec:
audio = 1 / video
Čiže najskor si určíme ako veľmi chceme skrátiť alebo predĺžiť video. Napr. 0.8 znamená, že na každú minútu bude video o 12 sekúnd kratšie. A následne vypočítame audio parameter 1 / 0.8 = 1.25 a dosadíme do príkazu.
Zmenšenie videa
Najúčinnejšou metódou je popreskakovať nejaké rámce, prípadne znížiť bitrate:
ffmpeg -i input.mkv -vf "scale=iw/2:ih/2" half_the_frame_size.mkv ffmpeg -i input.mkv -vf "scale=iw/3:ih/3" a_third_the_frame_size.mkv ffmpeg -i input.mkv -vf "scale=iw/4:ih/4" a_fourth_the_frame_size.mkv
Viac informácií na tomto linku.
Odstránenie štartovacieho času
TODO
Správy TV Markíza
Televízne noviny na Markíze používaju pomerne zložitý mechanizmus servovania videa, kvoli preemptívnemu načítavaniu a tiež vstupovaniu reklám. Podstatné je, že formát TS je vlastne klasický MPEG so špeciálnymi vlastnosťami. Ak si chceme vytvoriť video zo správ na mieru, postupujme takto:
- Pustíme si správy a posťahujeme všetky TS súbory. Premenujeme ich tak, aby išli sekvenčne za sebou, čiže napr. z media_b505216_2.ts na media_b505216_02.ts
- Obvykle chceme aby finálne video malo tri časti:
- PREHĽAD (zvučka a tri uputávky)
- ÚVOD (predstavenie hlásateľov, ktoré je na začiatku prvej reportáže, ktorú obvykle nespracovávame)
- REPORTÁŽ (samotná reportáž, ktorú chceme stiahnuť)
Z tej druhej časti, teda z úvodu prvej reportáže nám stačí prvý video súbor, a premenujeme ho tak, aby bol akoby posledným videom prvej časti. Zároveň ho ale budeme musieť ustrihnúť, aby nám ten začiatok prvej reportáže tam nezavadzal, viz bod 4 tohto návodu.
- Prekonvertovat všetky TS na MPEG:
for i in *.ts; do ffmpeg -i $i -qscale 0 "$i.mpeg"; done
- Urezanie strednej časti na dĺžku 9.5 sekúnd vykonáme takto:
ffmpeg -i media_b501936_99.ts.mpeg -qscale 0 \ -ss 00:00:00 -t 00:00:09.50 media_b501936_99.ts.CUT.mpeg
- Následne to už celé pozliepame, ciže prvú časť (PREHĽAD), druhú časť (ÚVOD) a tretiu časť (REPORTÁŽ):
cat media_b501936_0?.ts.mpeg media_b501936_99.ts.CUT.mpeg media_b505216_??.ts.mpeg \ | ffmpeg -f mpeg -i - -qscale 0 -vcodec mpeg4 output.mp4
-
Výsledné video je v súbore output.mp4
Ešte môžeme zmenšiť veľkosť výsledného súboru:ffmpeg -i output.mp4 -qscale 4 output-small4.mp4 ffmpeg -i output.mp4 -qscale 1 output-small1.mp4