IT rekvalifikace s garancí práce. Seniorní programátoři vydělávají až 160 000 Kč/měsíc a rekvalifikace je prvním krokem. Zjisti, jak na to!
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

5. diel - Ffmpeg a transcoding - Strihanie, skladanie, výrezy

V predposlednej a minulej lekciu, Ffmpeg a transcoding - Rozlíšenie, Bitrate , sme si predviedli zmenu súborového kontajnera, zmenu kodeku (komprimačného algoritmu), zmenu rozlíšenia a zmenu dátového toku (bitrate) videa. Tieto operácie sú, ak sa dá tak povedať, základom a môžu stačiť pre 80% úprav multimediálnych súborov. Teraz nás čakajú strihy a skladanie. To je vhodné napr. Ak si nahráte nejaký video súbor z televízie a sú v ňom reklamy. Je pochopiteľné, že sa ich chcete zbaviť. V FFmpeg neexistuje žiadna funkcia, ktorá spozná v obrazu, že sa jedná o reklamy alebo niečo, čo tam nechcete. Musíme na to ísť tak, že z celého videa (stopy) vyrežeme kratšie úseky a tie potom zlúčime do jedného videa. Nevýhoda je, že to je trochu pracné.

Formát času v FFmpeg

Čas je v FFmpeg definovaný celkom jednoducho v tvare (formáte) hodina: minúta: sekunda.milise­kunda. Napr. takto: 01:23:17.423. Dlhšie časové stopy ako 24 hodín asi ťažko využijete.

Strihanie (trim) videa

Vyrezanie videa je jedna z jeho najdôležitejších úprav. Vykonáva sa cez špecifické parametre udávajúce začiatok novej stopy: -ss 00:00:00 a jej koniec: -to 00:00:00. Na prvom príklade si ukážeme, ako vytvoriť 5 sekundové video v kodeku h264 s bitrate 3000 kbs a mp3 s 192 kbs z nášho vzoru. Potom si vyrobíme ešte dve ďalšie videá, hlavne preto, aby sme mali podklady pre spájanie videa ďalej.

Príkaz pre vyrezanie 5s z videa je nasledujúci:

ffmpeg -i video.mp4 -ss 00:00:05 -to 00:00:10 -c:v libx264 -b:v 3000K -c:a mp3 -b:a 192K videoStrih1.mkv -hide_banner

Samozrejme možno tento príkaz napísať aj bez špecifikácie konečného času a len dobou trvania video stopy. Definujeme teda začiatok a dĺžku stopy. Tento variant sa špecifikuje tak, že zadáme štart ako -ss 00:00:00 a dĺžku video stopy ako -t 00:00:05 alebo -t 5:

ffmpeg -i video.mp4 -ss 00:00:05 -t 5 -c:v libx264 -b:v 3000K -c:a mp3 -b:a 192K videoStrih1.mkv -hide_banner

Na druhom príklade si predvedieme vytvorenie 8 sekundového videa s identickými parametrami ako v prípade prvého:

ffmpeg -i video.mp4 -ss 00:00:15 -to 00:00:23 -c:v libx264 -b:v 3000K -c:a mp3 -b:a 192K videoStrih2.mkv -hide_banner

Na treťom príklade si predvedieme vytvorenie 4 sekundového videa s identickými parametrami ako v prípade prvého:

ffmpeg -i video.mp4 -ss 00:00:37 -to 00:00:41 -c:v libx264 -b:v 3000K -c:a mp3 -b:a 192K videoStrih3.mkv -hide_banner

Ako vidíte, videá sa vyrobila. Ak si ich prehráte, tak možno pozorovať dĺžku prvého videa 5 sekúnd, v prípade druhého videa 8 sekúnd au posledného 4 sekundy:

strih videa - Úprava audio a video súborov pomocou frameworku FFmpeg

Týmto jednoduchým spôsobom získame video / audio úseky. FFmpeg nedisponuje iným spôsobom, ako identifikovať v obrazu napr. Reklamy. Je nutné vždy manuálne identifikovať časy, kedy dochádza k zmene. Takých stop si potom musíme vyrobiť niekoľko a tie potom spojiť do jedného súboru. To je presne to, čo si ďalej ukážeme.

Skladanie viac videí do jedného súboru

V FFmpeg existujú celkom dva spôsoby pre spájanie multimediálnych súborov, o ktorých viem. Prvá možnosť je cez concat demuxer a druhá cez concat filter. Ja osobne používam filter, pretože demuxer vie pracovať len so súborovým kontajnerom .ts (vraj aj .avi, .mpg).

Concat demuxer

Je teda nutné najskôr previesť danej stopy do daného formátu a až potom možno cez concat demuxer spojiť daná videa do jedného súboru.

Tu je variant bez prekódovanie:

ffmpeg -i "concat:003out.ts|004out.ts" -c copy output.ts

A tu je variant s překódováním a uložením do iného typu kontajnera:

ffmpeg -i "concat:000out.ts|005out.ts" -vcodec h264 -b:v 1800K -acodec mp3 output.mp4

Concat filter

Ako druhá možnosť je využívať concat filter (známy ako mapa). Pôsobí síce zložitejšie, ale zato je univerzálnejší a efektívnejšie. Nestretol som sa so situáciou, že by mi nepodporoval nejaké kódovanie a nejaký súborový formát, ktorý FFmpeg podporuje. Takže ak by sme chceli spojiť tie tri videa v kodeku h264 s bitrate 3000 kbs a mp3 s 192 kbs z nášho vzoru, ktorý sme vytvorili v prvej časti tejto lekcie, potom by príkaz vyzeral takto:

ffmpeg -i videoStrih1.mkv -i videoStrih2.mkv -i videoStrih3.mkv -c:v libx264 -b:v 3000K -c:a mp3 -b:a 192K -filter_complex "[0:v] [0:a] [1:v] [1:a] [2:v] [2:a] concat=n=3:v=1:a=1 [v] [a]" -map "[v]" -map "[a]" videoCelek.mkv

Pôsobí celkom zložito, ale zase tak zložité to nie je. Poďme si vysvetliť jeho jednotlivé časti:

  • -i videoStrih1.mkv -i videoStrih2.mkv -i videoStrih3.mkv - jedná sa o zdrojové súbory, ktoré majú byť spojené
  • -c:v libx264 -b:v 3000K -c:a mp3 -b:a 192K - špecifikácia video a audio kodeku vr. jeho bitrate (dátového toku)
  • videoCelek.mkv meno výstupného súboru
  • -filter_complex "[0:v] [0:a] [1:v] [1:a] [2:v] [2:a] concat=n=3:v=1:a=1 [v] [a]" -map "[v]" -map "[a]" - špecifikácia nastavenie mapy, ktoré si podrobne rozpíšeme:
    • [0:v] [0:a] [1:v] [1:a] [2:v] [2:a] - tu definuje stopy (streamy) zo vstupných súborov, napr. [0:v] je video stopa zo súboru videoStrih1.mkv, [2:a] je audio stopa zo súboru videoStrih3.mkv pod.
    • concat=n=3:v=1:a=1 [v] [a] - vstupom sú 3 stopy, ktorý sa budú spájať, a výstupom je jedna video stopa a jedna audio stopa
    • -map "[v]" -map "[a]" - informácia o tom, že výstupné video a audio je zložené z mapy
výsledok:
Spojenie viac video súborov v jeden v FFmpeg - Úprava audio a video súborov pomocou frameworku FFmpeg

Možno to pôsobí zložito, ale ak si to párkrát skúsite, potom zistíte, že to moc zložité nie je. Analogicky takto môžete spájať video aj z menej vstupov (2 vstupov) či naopak z viacerých (4, 5, 6, 7, 8, .. vstupov).

Uveďme si vzorový príklad ako vytvoriť 4 stopy az nich jedno spoločné video. V prípade viac / menej stop prevedieme analogicky úpravu. Mimochodom, nie je problém si z toho urobiť * .bat skript a trochu si celý postup zautomatizovať.

ffmpeg -i 000out.ts -vcodec h264 -b:v 3M -ss 0:04:47 -to 0:11:16 -acodec aac Test1.mkv
ffmpeg -i 000out.ts -vcodec h264 -b:v 3M -ss 0:18:19 -to 0:29:51 -acodec aac Test2.mkv
ffmpeg -i 000out.ts -vcodec h264 -b:v 3M -ss 0:35:41 -to 0:47:22 -acodec aac Test3.mkv
ffmpeg -i 000out.ts -vcodec h264 -b:v 3M -ss 0:55:07 -to 1:17:42 -acodec aac Test4.mkv
ffmpeg -i Test1.mkv -i Test2.mkv -i Test3.mkv -i Test4.mkv -vcodec h264 -b:v 3M -acodec aac -filter_complex "[0:v] [0:a] [1:v] [1:a] [2:v] [2:a] [3:v] [3:a] concat=n=4:v=1:a=1 [v] [a]" -map "[v]" -map "[a]" Video4Stopy.mkv

Výrezy (Croping) videa

FFmpeg nám samozrejme umožňuje vykonať aj výrez videa. To sa vykonáva cez filter, napr. -filter:v "crop=w:h:x:y", kde w ku šírka a h výška videa, x a y je poloha východiskového bodu vo videu nášho výreze. Obrazovka je vlastne graf pixelov a pozície [0,0] sa nachádza v ľavej hornom rohu obrazu. Znamienkový konvencie obrazovky (grafu) je + / + doprava / dole. Ak by sme napríklad chceli, aby sme začali s videom v ľavom hornom rohu, potom súradnice budú x = 0, y = 0 a veľkosť výrezu obdĺžnika bude 800 na 600. Príkaz by bol potom nasledujúce:

ffmpeg -i video.mp4 -filter:v "crop=800:600:0:0" -c:v libx264 -b:v 5000K -c:a mp3 -b:a 192K videoCrop.mkv -hide_banner

Ak však chceme posunúť východiskový bod v osi x o 500 pixelov a v osi y o 1500 pixelov a výsledný obdĺžnik chceme 640 x 480, potom príkaz bude nasledujúce:

ffmpeg -i video.mp4 -filter:v "crop=640:480:500:1500" -c:v libx264 -b:v 5000K -c:a mp3 -b:a 192K videoCrop1.mkv -hide_banner

Zmena rýchlosti behu videa (audia)

Samozrejme možno aj video príp. audio zrýchliť / spomaliť, podľa toho, čo si budete priať. To zaistíme filtrom s parametrom "setpts=x*PTS". Pokiaľ bude x väčší ako 1, potom video spomaľujeme, a pokiaľ bude menší ako 1, potom video zrýchľujeme. Skúsme si to:

ffmpeg -i video.mp4 -vf "setpts=0.25*PTS" Zrychleni4x.mp4

Nezabudnite, zrýchľovanie / spomaľovanie vždy vykonávajte na samostatnom streamu (videa alebo audia). A pri zrýchlení oblasť stopy odrezať

V budúcej lekcii, Ffmpeg a Transcoding - Audio , si preberieme kodeky a úpravu audio streamu.


 

Predchádzajúci článok
Ffmpeg a transcoding - Rozlíšenie, Bitrate
Všetky články v sekcii
Úprava audio a video súborov pomocou frameworku FFmpeg
Preskočiť článok
(neodporúčame)
Ffmpeg a Transcoding - Audio
Článok pre vás napísal Robert Michalovič
Avatar
Užívateľské hodnotenie:
Ešte nikto nehodnotil, buď prvý!
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