Vraag Converteer een video door de uiteindelijke grootte in te stellen


Is er een manier om de maximale uiteindelijke grootte in te stellen voor het converteren van video met ffmpeg (of een andere op CLI gebaseerde video-omzetter)?

Alsof ik een 100 MB-video heb en deze wil converteren naar een 10 MB-video met de hoogste kwaliteit mogelijk, gezien het uiteindelijke formaat is niet belangrijk.


2
2018-04-23 04:53


oorsprong




antwoorden:


Gaan van 100mb naar 10mb is een enigszins onrealistisch 90% afname in grootte, maar ik zal een voorbeeld geven van het reduceren tot 50MB, waardoor een H.264-video ontstaat een meer redelijk 50% verkleining en verkleinen tot 40 MB met HEVC.

Ik gebruik het volgende voorbeeldbestand:

wget http://dl3.h265files.com/TearsOfSteel_720p_h265.mkv

U kunt dit voorbeeldbestand gebruiken om de volgende resultaten te bevestigen die ik heb gegeven en misschien experiment een beetje verder jezelf. MediaInfo onthult het volgende voor dit gedownloade bestand:

mediainfo \
--Inform="General;Duration=%Duration/String3%\nFile size=%FileSize/String1%" \
TearsOfSteel_720p_h265.mkv
Duration=00:12:14.058   <-----
File size=101 MiB       <-----

De pijlen zijn natuurlijk van mijzelf! Je hebt dan misschien 2 hele goede keuzes:

  1. Codeer opnieuw naar H.264
  2. Hercoderen naar HEVC

1. Re-Encode tot H.264 (50mb)

H.264 wordt nu algemeen geaccepteerd en zou een uitstekende keuze zijn voor uw uitvoervideobestand. De formule om de outputbitsnelheid voor de gewenste 50mb te berekenen zou dan zijn:

(50 MiB * 8192 [converts MiB to kBit]) / 734 seconds = ~558 kBit/s total bitrate
558 - 128 kBit/s (desired audio bitrate) = 430 kBit/s video bitrate

Om dit te bereiken gebruikt u de volgende FFmpeg 2-passopdracht:

ffmpeg -y -i TearsOfSteel_720p_h265.mkv \
      -c:v libx264 -b:v 430k -pass 1 \
      -c:a libmp3lame -b:a 128k -f mp4 /dev/null && \
ffmpeg -i TearsOfSteel_720p_h265.mkv \
       -c:v libx264 -b:v 430k -pass 2 \
       -c:a libmp3lame -b:a 128k TearsOfSteel_smaller.mp4

De resulterende bestandsgrootte is 49,4MiB met vrij redelijke, maar niet verbazingwekkende kijkkwaliteit. Best goed voor een 50% vermindering van de bestandsgrootte en een reusachtig drop in video bitrate eigenlijk!

2. Hercoderen naar HEVC (40mb)

Een andere keuze (zoals voorgesteld door emk2203) is om de bestaande HEVC-stream opnieuw te coderen met een lagere bitsnelheid, deze keer gericht op 40 MB omdat HEVC een betere kwaliteit claimt bij een lagere bitrate.

Deze keer zou de formule zijn:

(40 MiB * 8192 [converts MiB to kBit]) / 734 seconds = ~446 kBit/s total bitrate
446 - 128 kBit/s (desired audio bitrate) = 318 kBit/s video bitrate

en de opdrachtregel voor FFmpeg 2-pass is:

ffmpeg -y -i TearsOfSteel_720p_h265.mkv \
      -c:v libx265 -x265-params pass=1 -b:v 318k \
      -c:a libmp3lame -b:a 128k -f mp4 /dev/null && \
ffmpeg -i TearsOfSteel_720p_h265.mkv \
       -c:v libx265 -x265-params pass=2 -b:v 318k \
       -c:a libmp3lame -b:a 128k TearsOfSteel_smaller.mp4

En dit levert een 40mb-bestand op Redelijk kwaliteit.

Ten slotte:

Van deze voorbeelden kunt u experiment verder door de vereiste MiB in de formule te verlagen en de daaropvolgende kijkkwaliteit te observeren. Veel plezier!!

Referenties:


5
2018-04-25 09:45



Enige opmerking over de libx264 video-codec? De rest is goed gedetailleerd. - Asme Just
@AsmeJust Enkele opmerkingen toegevoegd :) - andrew.46
Naar de oude H.264-codec gaan is in deze situatie geen goed idee. H.265 is speciaal gemaakt voor situaties waarin sprake is van een bitrate, zoals deze, waarbij OP wil comprimeren tot 10% van de oorspronkelijke grootte. Dus een betere oplossing zou zijn om H.265 te behouden met een 'lib265'-onderdeel in de ffmpeg lijnen. De OPs-eisen maken H.265 hier praktisch verplicht. Het is het enige formaat dat extreme compressie kan uitvoeren en toch een beetje beeldkwaliteit behoudt. - emk2203
@ emk2203 Goed punt. Let wel: als je de wiskunde doet voor een 10MB codering voor dit bestand, zul je zien dat de doelbitsnelheid voor H.264 of HEVC eigenlijk negatief 16MiB :) is. Ik zal echter een voorbeeld toevoegen voor hercodering van HEVC na het vinden van de juiste plek voor bestandsgrootte en ten minste respectabele videokwaliteit ... - andrew.46
@ emk2203 Een voorbeeld toegevoegd in .... - andrew.46


Ja. Kies een videocodec (x264 is een goede universele codec) en kies de resolutie, laat de meeste instellingen standaard staan, maar voer een 2-traps conversie uit met een vaste gemiddelde bitrate.

Snelle les in videocompressie: de complexiteit van video verandert gedurende de hele video, dus als je de hele tijd door comprimeert tot hetzelfde visuele kwaliteitsniveau, dan schommelt de feitelijke bitrate op en neer. Als je comprimeert naar een vaste bitrate, zal de kwaliteit slecht zijn in bits van hoge complexiteit omdat de bitrate te laag is en / of de bitrate die gebruikt wordt te hoog is voor de delen met lage complexiteit. Zo veel als je kunt laat je het streven naar een constante kwaliteit en laat je de bitsnelheid fluctueren. Maar als de compressor op een bepaalde bestandsgrootte mikt, weet het niet of de complexiteit van de video omhoog of omlaag gaat in de gedeelten die nog niet zijn geconverteerd. Daarom gebruiken mensen een conversie van 2 passages wanneer ze streven naar een bepaalde bestandsgrootte.

Je moet de uitvoer specificeren als een bitrate (audio en video, plus de container heeft een lichte overhead), dus je hebt een rekenmachine nodig om van bestandsgrootte en duur naar een bitrate te converteren.


1
2018-04-23 05:09



Kun je alsjeblieft een voorbeeld geven? Noten, de kwaliteit is niet echt belangrijk voor mij, ook al wil ik dat het de hoogst mogelijke is. - Asme Just