it-swarm-eu.dev

Jak mohu zmenšit velikost videa pomocí ffmpeg?

Jak mohu použít ffmpeg ke zmenšení velikosti videa snížením kvality (co nejmenší, samozřejmě, protože potřebuji, aby běžel na mobilním zařízení, které ne máte hodně volného prostoru)?

Zapomněl jsem zmínit, že když video může používat titulky (* .srt nebo * .sub), chtěl bych je také převést, aby odpovídal parametrům převedeného video souboru.

265
xralf

Viz this odpověď. Níže uvádíme pro pohodlí:

Vypočítejte potřebný datový tok vydělením 1 GB délkou videa v sekundách. Takže pro video o délce 16:40 (1 000 sekund) použijte datový tok 10 000 000 bajtů/s:

ffmpeg -i input.mp4 -b 1000000 output.mp4

Dalšími možnostmi, které by stálo za zvážení, je nastavení faktoru konstantní rychlosti, který snižuje průměrnou bitovou rychlost, ale zachovává si lepší kvalitu. Měňte CRF mezi 18 a 24 - čím nižší, tím vyšší datový tok.

ffmpeg -i input.mp4 -vcodec libx265 -crf 20 output.mp4

Změňte kodek podle potřeby - libx264 může být k dispozici, pokud libx265 není, za cenu mírně větší výsledné velikosti souboru.

318
Vicky Chijwani

Zmínili jste se o tom, že chcete zmenšit velikost souboru tak, aby se vešlo na více mobilních zařízení, což je také můj případ. Všechny odpovědi jsou zde pro snížení kvality komprese, ale nikdo nezmínil snížení velikosti video rámečku. Je to mnohem rychlejší, asi 3 až 5krát rychlejší, než podle mé zkušenosti komprimovat. Další informace naleznete v dokumentech ffmpeg na škálování .

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
38
georgiecasey

Pokud hledáte konkrétní datový tok, doporučuji -crf možnost. Toto je nejčastěji používané pro x264 kódování: http://slhck.info/articles/crf

Stručně řečeno: CRF 23 by vytvořil film v kvalitě „DVD“ (~ 700 MB-1 GB) a nižší hodnoty CRF by byly ve vyšší kvalitě (větší soubory).

35
Tom Kelly

Testoval jsem většinu dalších navrhovaných odpovědí na tuto otázku. Závěry testovacích dat jsou uvedeny níže. Toto jsou navrhované odpovědi, které jsem testoval:

(BR) Upravte datový tok pomocí:

ffmpeg -i $infile -b $bitrate $newoutfile 

(CR) Změňte faktor konstantní rychlosti pomocí:

ffmpeg -i $infile -vcodec libx264 -crf 23 $outfile

(SZ) Změňte velikost obrazovky videa (například na polovinu velikosti pixelu) pomocí:

ffmpeg -i $infile -vf "scale=iw/2:ih/2" $outfile

(BL) Změňte profil H.264 na „základní“ pomocí:

ffmpeg -i $infile -profile:v baseline $outfile

(DF) Použijte výchozí zpracování ffmpeg pomocí:

ffmpeg -i $infile $outfile

[~ # ~] data [~ # ~]

  • "size" - procento velikosti převedeného videa v poměru k původnímu.
  • "bitrate" - datové toky původních a převedených videí.
  • "definice" - velikost videa v pixelech.
  • "převést" - čas převést video v sekundách.

Pomocí navrhované metody jsem vypočítal cílový datový tok pro (BL).

=== Soubor A - Jak Node Pomáhá propalovat úhel-Fnbixa7Ts6M.mkv ===

            original    BR         CR         SZ         BL         DF
            --------    ---        --         --         --         --
size        64152 kb    214%       76%        40%        83%        76%
bitrate     411 kb/s    883        313        165        342        313
definition  1920x1080   1920x1080  1920x1080  960x540    1920x1080  1920x1080
convert     --          648        509        225        427        510

=== Soubor B - Použití GraphQL s Angular _ By - Lee Costello-OGyFxqt5INw.mkv ===

            original    BR         CR         SZ         BL         DF
            --------    ---        --         --         --         --
size        410301 kb   33%        109%       28%        143%       109%
bitrate     2687 kb/s   880        2920       764        3843       2920
definition  3840x2160   3840x2160  3840x2160  1920x1080  3840x2160  3840x2160   
convert     --           2307       3188       1116       2646       3278

[~ # ~] závěry [~ # ~]

  • Metoda (SZ) je rozhodně nejrychlejší metoda. Bylo 2krát až 4krát rychlejší. To může být velmi problém u videí s vysokým rozlišením, protože převedení všech ostatních metod trvalo déle, než je skutečná délka videa! Například metoda (CR) převedla 21 minutové video na 53 minut.

  • Metoda (SZ) je určitě nejlepší metoda, pokud je definice videa větší než definice obrazovky, která ji bude zobrazovat. Pokud například váš telefon dokáže zobrazit pouze obrázek ve formátu 1080p, odeslání videa ve formátu 3840 x 2160 je jen zbytečné. Nejlepší by bylo snížit jeho polovinu na 1080p.

  • Některé z navrhovaných odpovědí skutečně zvýšily velikost některých videí. Například metoda (BR) více než zdvojnásobila velikost vzorku 1080p. To však učinilo velikost 2160p jednou třetinou. U vzorku s vysokým rozlišením všechny metody (CR), (BL) a (DF) zvýšily velikost videa.

Správná (nebo nejlepší) odpověď

Nejlepší je vždy nejprve snížit rozlišení na maximum podporované vaším cílovým displejem.

Pokud chcete velikost souboru dále zmenšit, bude to záležet na osobních volbách. Můžete buď snížit obsah informací, nebo zvýšit kompresi.

  • Pokud to není něco, co se vás týká, můžete snížit rozlišení více.

  • Pokud video neobsahuje rychlé akční scény, možná budete chtít snížit snímkovou frekvenci.

  • Pokud máte výkonný procesor a jediným problémem je prostor, můžete zvýšit míru komprese.

  • Bitová rychlost je kombinací více faktorů. Takže pouhé řeknutí ffmpegu, aby snížil přenosovou rychlost, vám nemusí přinést požadované výsledky.

  • Dalším způsobem nižšího obsahu informací je snížení barevné hloubky. Jak to udělat, ještě nebylo projednáno.

28
John Pankowicz

Všimněte si, že se zdá, že ffmpegjiž provádí nějakou optimalizaci, když běží bez voleb, takže před pokusem o použití nastavení, kterému nerozumíte nebo se rozhodnete explicitně ztratit informace, zkuste výchozí konverze:

ffmpeg -i input.mp4 output.mp4

V mém případě to snížilo datový tok videa i zvuku (můžete zkontrolovat a porovnat vstupní a výstupní soubor spuštěním ffprobe), přeměnit 700Mb video na 60Mb zdánlivě podobné kvality .

Komprimoval jsem 40minutovou prezentaci HD videa z 505 MB na 183 MB
Je to jako jít od 100 MB do 36 MB.
Původní video bylo HD a výstup byl téměř nulový znatelný rozdíl.
Je to video soubor "Chtěl bych si to udržet, ale HD je nadměrné."
Zde je příkaz, který jsem použil s důvody:

ffmpeg -n -loglevel error -i inputfile.mp4 -vcodec libx264 -crf 28 -preset faster -tune film outputfilename.mp4

  • -n: vyhnout se přepsání výstupních souborů (bezpečnější pro testování a pak dávkování)
  • -loglevel error: Zobrazit chyby a skrýt řádky a řádky postupu
  • -i inputfile.mp4: Název vstupního souboru
  • -vcodec libx264: Přejel z nejvyšší odpovědi výše
  • -crf 28: Komprese s jedním průchodem s malým znatelným rozdílem ( "0 = bezeztrátová, 23 = výchozí, 51 = nejhorší; subjektivně rozumný rozsah je 17 –28" ) ref dokumenty
  • -preset faster: Vypadá 2x rychleji než výchozí doba kódování 'medium' ref docs
  • -tune film: Zadejte vstup je video HQ (další možnosti zahrnují 'cartoon', 'stillimage' ..) ref docs
  • outputfilename.mp4: Název výstupního souboru

Pro adresář video souborů:

for i in *.{avi,flv,m4v,mov,wmv,mp4,MP4,TS,mkv}; do ffmpeg -n -loglevel error -i "$i" -vcodec libx264 -crf 28 -preset faster -tune film "cc${i}"; done

Problémy:

  • čistší způsob shromažďování „všech videosouborů“ bez nutnosti všech přípon v příkazu
  • čistší způsob, jak vydat název souboru bez předpony „cc“, a být schopen odstranit video před odstraněním
  • Soubory .webm S příkazem nefungují. Musel se zaměnit "cc${i}""${i%.*}.mp4"

Ruční brzda je alternativa s otevřeným zdrojovým kódem a uživatelským rozhraním

4
Jake Berger

Mám recept, který jsem původně vytvořil pro sebe, abych převedl videa Motion JPEG, která generuje můj starý fotoaparát (jedná se o velmi velká videa, protože každý snímek je celý obrázek JPEG) na h264. Zde je adaptace pro další druhy videí (kurzy atd.).

Jsem nepoužívám ffmpeg, ale mplayer a mencoder. Nejprve musíme demuxovat zvuk pomocí mplayeru:

mplayer -vo null -ao pcm:fast:file=<audio_pcm.wav> <video>
  • Parametry -vo null A -ao null Říkají mplayer, aby video nezískal.

V dalších krocích provedeme tříprůchodovou kompresi s mencoderem. Při prvním průchodu zvolíme vhodnou kompresi v režimu konstantní kvality (crf parametr) jako výchozí bod:

mencoder <video> -ovc x264 \ 
         -x264encopts ratetol=100:preset=veryslow:crf=<value>:pass=1 \
         -nosound -o video1.h264
  • Můžeš přidat slow_firstpass parametr k -x264encopts pokud jste paranoidní s konečnou kvalitou videa. Manuál Mencoder říká, že tato možnost deaktivuje některé parametry, které „výrazně zlepšují rychlost kódování a zároveň mají malý nebo žádný dopad na kvalitu konečného průchodu“. Použijte jej pouze v posledním kroku.

  • Měli byste vyzkoušet několik hodnot crf - zkuste začít od 25 a pokračujte v jeho zvyšování, dokud si na výsledném videu nevšimnete artefaktů (vyšší hodnoty komprimují více). Nezapomeňte, že následující kódovací průchody zlepší kvalitu, kterou jste vybrali crf.

  • Alternativy pro velmi pomalý přednastavené jsou pomalejšízpomalitstřední Úplný seznam najdete v příručce k mencoderu.

  • ratetol řídí kolísání datového toku - nejsem si jistý, zda dělám tu správnou věc, ale nastavil jsem ji na maximální hodnotu, aby umožnil naprostou svobodu pro mencoder zvolit správný datový tok pro každou scénu.

Po prvním průchodu si všimnete, že poslední řádek udává průměrnou datovou rychlost, kterou použijete v následujících krocích:

(...)
x264 [info]: kb/s:526.43

Změň crf parametr, doporučený při prvním průchodu, do bitrate, požadováno při následujících průchodech:

mencoder <video> -ovc x264 \
       -x264encopts slow_firstpass:ratetol=100:preset=veryslow:bitrate=526:pass=3 \
       -nosound -o video2.h264

Toto druhé průchodové kódování bude číst statistiky generované při prvním průchodu (divx2pass.log A divx2pass.log.mbtree), Aby se optimalizovala komprese.

  • Všimněte si, že budete používat stejný video vstup, nikoli generovaný výstupním videem prvního průchodu - první průchod je užitečné pouze ke kontrole počáteční kvality.

  • Všimněte si také, že pass=3 (nepass=2) Vygeneruje nový statistický soubor, takže můžete poslední krok opakovat, kolikrát chcete. Obvykle dělám pass=3 Dvakrát, vždy věnuji pozornost výslednému datovému toku.

Mezitím můžete také komprimovat zvuk pomocí lame nebo oggenc:

oggenc -q<n> <audio_pcm.wav>

Nakonec budeme remuxovat zvuk a video

mencoder -audiofile <audio>.ogg video2.h264 -oac copy -ovc copy \
         -of lavf -lavfopts format=mp4 -o <video>.mp4
  • -of lavf -lavfopts format=mp4 Generuje formát souboru mp4 Pomocí muxerů lavopts.
3

Budete muset použít dvouprůchodové kódování pro „přizpůsobení“ videa do určené velikosti souboru (datový tok), aniž byste příliš drasticky snížili kvalitu. Toto je docela podrobné téma: http://web.archive.org/web/20171130050515/http://www.mpabo.com/2014/12/14/ffmpeg-and-x264-encoding-guide /

2
SaltySub2

Napsal jsem bash skript pro zmenšení velikosti videa a pro automatické zkoušení různých hodnot crf.

V podstatě budete

  • zvolte rozsah hodnot crf
  • spusťte skript
  • zkontrolujte velikost generovaných videí a vyberte to, které chcete

To je opravdu užitečné, pokud máte omezení velikosti, kterého chcete dosáhnout, a nevíte, jaká je hodnota crf, která vám to umožní.

Doufám, že to někomu pomůže. Sdílel jsem se svými kolegy a všichni to považovali za užitečné.

#!/bin/bash

# bigger values of crf will lead to a bigger compression (smaller video size)
#for i in 1 2 3 4 5
for i in {25..28}
do
# you can remove the option -y if you want to be asked if to overwrite a file with the same name (leave the -y only if you understand what you are doing, otherwise you might rewrite an important file)
   ffmpeg -y -i NAMEOFTHEVIDEOTOCOMPRESS.mp4 -c:v libx264 -crf $i -preset veryfast -profile:v baseline -level 3.0 -strict -2 out_$i.mp4
   printf "\n>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>Done compression at crf=$i \n\n"
done
2

Zde je příklad 2 průchodů. Docela tvrdě kódováno, ale opravdu to tlačí
#!/bin/bash ffmpeg -y -i "$1" -c:v libvpx-vp9 -pass 1 -deadline best -crf 30 -b:v 664k -c:a libopus -f webm /dev/null && ffmpeg -i "$1" -c:v libvpx-vp9 -pass 2 -crf 30 -b:v 664k -c:a libopus -strict -2 "$2"

1
Max Robbertze