Manipulácie s video súbormi

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.

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:

  1. 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
  2. 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.

  3. Prekonvertovat všetky TS na MPEG:
    for i in *.ts; do ffmpeg  -i $i -qscale 0 "$i.mpeg"; done
  4. 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
  5. 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
    
  6. 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