Slevový týden - Červenec ITnetwork summer 2020
30 % bodů zdarma na online výuku díky naší Slevové akci!
Pouze tento týden sleva až 80 % na e-learning týkající se C#

Lekce 3 - FFmpeg a transcoding - Kontejner, Kodek

V minulé lekci, FFprobe - Analýza multimediálních souborů, jsme si ukázali, jak získat klíčové informace o audio/video stopách multimediálního souboru a vysvětlili si co vlastně znamenají.

Nyní nás čeká samotná úprava (transcoding) multimediálních souborů.

V případě transcodingu se kódování/dekódování děje automaticky mimo naši kontrolu. FFmpeg dle parametrů příkazu pozná, jestli je překódování nutné či nikoli. Předvedeme si zejména úpravu video obsahu, protože ten zabírá většinou 90-95% obsahu souborového kontejneru. Vše si předvedeme na videu, které jsme si stáhli v minulé lekci z uloz.to. Samozřejmě si lze příklady zkoušet i na vašich videích, např. z telefonů, digitálních kamer apod.

Změna souborového kontejneru (souborového formátu)

Jak jsme si uvedli v první lekci, existuje nepřeberné množství souborových kontejnerů, jenž slouží jako úložiště pro multimediální obsah. Zde na tomto odkazu lze zjistit jaké souborové formáty jsou v FFmpeg podporovány. Jak vidíte, množství formátů k dekódování (vstupy) je skutečně obrovské. Počet souborových kontejnerů ke kódování (výstup) již tak ohromný není. Nicméně ty nejznámější podporované jsou např. Matroska (.mkv), Avi (.avi), Flash video (.flv), Ogg (.ogg), Mpeg (.mpeg), MP4 (.mp4) apod.. Samozřejmě si je nutné nejdříve ověřit, jestli je vámi požadovaný kontejner v FFmpeg podporován, ať se jedná o dekódování/kó­dování, než začnete něco zkoušet. Dále upozorním: neplatí, že každý souborový kontejner podporuje všechny kodeky. Může nastat situace, kdy FFmpeg ukončí svou práci s tím, že vámi zvolený kontejner nepodporuje, nebo kontejner nepodporuje vámi zvolený kodek.

Změna formátu z mp4 na mkv

Pro začátek si předvedeme, jak změníme souborový formát z *.mp4 na *.mkv. V tomto případě se konverze souborového kontejneru provede včetně kódování/dekódování defaultně nastavenými kodeky i s jejich parametry v FFmpeg:

ffmpeg -i video.mp4 video.mkv -hide_banner

Mě osobně nikdy jejich defaultní nastavení nevyhovovalo.

Transkódování souboru v FFmpeg

Pokud porovnáme vstupní a výstupní soubor, pak si všimneme, že došlo ke zmenšení velikosti souboru z 234MB na 191 MB. Po prohlídce výpisu je jasné, že to bylo způsobeno změnou bitrate (hustotou datového toku) z 43 MB na 35MB. Dále byl změněn audio kodek z AAC na vorbis.

Porovnání vstupu a výstupu
Tento výukový obsah pomáhají rozvíjet následující firmy, které dost možná hledají právě tebe!

Asi nejvýhodnější řešení je ponechat nastavení audio i video kodeku vč. hustoty datového toku na stejné úrovni. Tím se zajistí stejná kvalita videa i audia jako v předchozím kontejneru. Nicméně vzniká riziko, že daný kodek nemusí být ve zvoleném souborovém kontejneru podporován. Ponechání nastavení zajistíme přidáním dvou parametrů pro video kodek -vcodec copy a audio kodek -acodec copy:

ffmpeg -i video.mp4 -vcodec copy -acodec copy videoNEW.mkv -hide_banner

Protože v tomto případě nedochází k dekódování/kó­dování, je transcoding velmi rychlý. Jak vidíte, kodek u audia zůstal stejný, hodnota datového toku je identická:

Porovnání vstupu a výstupu

Změna kodeku (komprimačního algoritmu) u videa/audia

V této části si předvedeme, jak se mění typ kodeku. Opět je to podobné, jako když měníme typ souborového kontejneru. Nejdříve ověříme, jestli FFmpeg podporuje daný kodek, viz. seznam podporovaných video kodeků pro zdrojový soubor. Také je nutné ověřit, jestli souborový kontejner podporuje multimediální stopu vámi vybraného kodeku. Pokud to nezjistíte v dokumentaci, pak to jednoduše zkuste přes příkaz ffmpeg a pokud proces spadne, pak daná kombinace nefunguje (tato varianta je rychlejší, než studium dokumentace).

Námi zvolený soubor máme v h264 a aac. Změníme jej (transcodujeme) do h265 (HEVC) a mp3. Kvalitu bitrate ponecháme na defaultu pro dané kodeky. Protože měníme kodeky, automaticky dochází k dekódování a kódování, což nějakou dobu trvá. Dále připomínám, abyste si mohli pouštět filmy s libovolnými kodeky na počítači, musíte mít dané kodeky nainstalovány. A pokud je chcete pouštět v TV, set-top-boxech, satelitních receiverech, DVD (blu-ray) přehrávačích, atd., je nutné, aby dané zařízení tento kodek podporovalo.

Pro změnu kodeku použijeme buď tento příkaz:

ffmpeg -i video.mp4 -vcodec libx265 -acodec mp3 videoH265.mkv -hide_banner

Nebo můžeme použít i druhé označení kodeku hevc:

ffmpeg -i video.mp4 -vcodec hevc -acodec mp3 videoH265.mkv -hide_banner

Alternativně lze pro definici kodeku použít i parametr -c:v kodek, kde:

  • -c říká FFmpeg, že se jedná o definici kodeku,
  • :v říká FFmpeg, že se jedná o video a
  • kodek je definice (označení) kodeku.

Příkaz by tedy byl:

ffmpeg -i video.mp4 -c:v libx265 -acodec mp3 videoH265.mkv -hide_banner

A výsledek:

Konverze videa do H265 a mp3

Jak vidíte, video se zkonvertovalo. Opět proveďte výpis přes ffprobe. Soubor se nám zmenšil na cca 115 MB, defaultní nastavení snížilo u videa datový tok na cca 21 Mb/s a u audia došlo ke snížení datového toku na 128 kb/s.

Zjištění označení kodeku

Problémem může být zjistit název parametru, kterým FFmpeg označíme daný typ kodeku. V příkladu výše jste si mohli všimnout, že pro stejný kodek dokonce existují dva parametry a to libx265 a hevc. Abyste zjistili zkratku pro vybraný kodek, existuje příkaz:

ffmpeg -codecs

Najděte svůj vybraný kodek. V příkladu si vybereme video kodek MPEG-4 Microsoft verzi 3, jeho označení msmpeg4v3. DE ve výpisu označuje, že jej lze dekódovat (Decode) / kódovat (Encode), takže pokud bychom jej chtěli využít, pak příkaz bude vypadat takto:

ffmpeg -i video.mp4 -vcodec msmpeg4v3 -acodec mp3 videoMPEG4vv3.mkv -hide_banner

Označení nejrozšířenějších kodeků

Pro příklad si uvedeme pár nejrozšířenějších kodeků. Nemám je všechny otestované, sám kóduji jen do h264, příp. h265 (hevc). Ani mpeg4 nepoužívám. Pokud je někde v závorce napsáno testováno, sám jsem tento kodek otestoval.

Typ kodeku (Rozšířený název) FFmpeg parametr
h264 (testováno) libx264
h265 (testováno) libx265
Xvid (testováno) libxvid
MPEG-1 video (testováno) mpeg1video
MPEG-2 video (testováno) mpeg2video
MPEG-4 (testováno) mpeg4
VP8 (testováno) libvpx
Google VP9 (testováno) libvpx-vp9
Windows Media Video 7 wmv1
Windows Media Video 8 (testováno) wmv2
Windows Media Video 9 wmv3

Podpora kodeků souborovými kontejnery

Dá se říci, že největší problém je prakticky vědět, který souborový kontejner (formát) podporuje jaké kodeky (video i audio kompresní algoritmy). Jednou z možností je cesta pokusu/omylu a další např. přes docela přehlednou tabulku, kde jsou zohledněny nejznámější kontejnery a kodeky. Nejsou tam uveřejněny všechny, ale jako odrazový můstek v orientaci vám to pomůže.

V příští lekci, FFmpeg a transcoding - Rozlišení, Bitrate, se budeme zabývat změnou rozlišení a bitrate.


 

Předchozí článek
FFprobe - Analýza multimediálních souborů
Všechny články v sekci
Úprava audio a video souborů pomocí frameworku FFmpeg
Článek pro vás napsal Robert Michalovič
Avatar
Jak se ti líbí článek?
3 hlasů
Programuji převážně v Javě SE,EE a trochu nativním C a CUDA. více viz.https://cz.linkedin.com/in/robert-michalovic
Aktivity (7)

 

 

Komentáře

Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zatím nikdo nevložil komentář - buď první!