Wat is de beste manier om een mp4 -bestand naar webm zonder kwaliteitsverlies (met vp8 of vp9) met ffmpeg?

Als ik ffmpeg -i in.mp4 out.webm doe, is de kwaliteit erg slecht. Ik kan een doelbitsnelheid specificeren via -b:v en constante kwaliteitsmodus via crf, dwz

ffmpeg -i in.mp4 -crf 10 -b:v 1M out.webm

Dit geeft een betere kwaliteit. Hiervoor moet ik echter de bitrate van de invoervideo opzoeken (hier 1M).

Ik heb ook gemerkt dat als je een veel grotere waarde opgeeft voor de doelbitsnelheid dan de bitsnelheid van de invoer (hier bijvoorbeeld -b:v 100M), ffmpeg gewoon lijkt te gebruik ongeveer de bitrate van de inputvideo met vp9 of een iets hogere bitrate met vp8. Deze oplossing lijkt echter niet de bedoelde manier om dit te doen.

Hoe zou je de crf-waarde kiezen en waarom?

Is er een parameter die automatisch de bitrate van het invoerbestand en een geschikte crf-waarde om dezelfde kwaliteit te krijgen als het invoerbestand?

Opmerkingen

  • Zet bitrate op 0. En experimenteer met crf . Maar uw methode met een hoge bitsnelheid werkt ook, aangezien de waarde fungeert als een plafond en niet als een doel.
  • @Mulvya: Betekent bitrate 0 dat er geen limiet is? Ik deed het niet ' vind dit niet in de man-pagina.
  • Met bitrate niet ingesteld op nul, wordt CRF beperkt door die waarde. Met nul is het ' s niet. Het ' is een eigenaardigheid van de VPn-encoders.
  • Oké, maar als ik de bitrate-parameter helemaal weglaat, wordt de kwaliteit erg slecht, zelfs als ik dat niet deed ' t geeft een bovengrens voor de bitrate.
  • Link voor 200k (zie eerste optie Aan). Zie voor WebM b: v 0 deze pagina .

Answer

Antwoord

Gebruik constante kwaliteit in twee doorgangen: ¹

ffmpeg -i input.mp4 -b:v 0 -crf 30 -pass 1 -an -f webm /dev/null ffmpeg -i input.mp4 -b:v 0 -crf 30 -pass 2 output.webm 

Uitleg:

Door de videobitsnelheid in te stellen op nul en tegelijkertijd de CRF (Constant Rate Factor) te specificeren, wordt de modus Constant Quality ingeschakeld die een bepaald perceptueel kwaliteitsniveau beoogt. Voor VP9 kan de CRF variëren van 0 (beste kwaliteit) tot 63 (kleinste bestandsgrootte).

Het is belangrijk om de videobitsnelheid op nul te zetten. Als je geen videobitsnelheid opgeeft, wordt deze standaard ingesteld op iets laags, waardoor je de kwaliteitsmodus Beperkt krijgt, waarbij elk frame een maximale bitsnelheid heeft. Hoewel dat handig kan zijn voor streaming, vermindert het de kwaliteit aanzienlijk omdat frames met veel beweging niet de bandbreedte hebben die nodig is om er goed uit te zien.

Een ander deel van de reden waarom je aan kwaliteit verliest, is dat webm (VP9) geeft er de voorkeur aan om in twee passages te coderen voor de beste resultaten. De eerste doorgang verzamelt statistieken over de video die vervolgens worden gebruikt in de tweede doorgang om een kleinere video van hogere kwaliteit te maken.

Zie de ffmpeg VP9-documentatie als u meer wilt weten.

Een woord over transcodering

Over het algemeen worden transcoderingsformaten (een gecomprimeerde video opnemen en deze opnieuw comprimeren met een andere codec) is een slecht idee, omdat je niet alleen de normale fouten toevoegt van videocodering met verlies, maar je verspilt ook bits in het nieuwe formaat door te proberen de artefacten van het oude te behouden.

Als je betekent letterlijk “zonder kwaliteitsverlies”

De -lossless 1 -optie van de VP9-encoder van ffmpeg maakt verliesloze kwaliteitsmodus mogelijk, maar met een potentieel enorme toename in bestandsgrootte.

Alles wat je nodig hebt is dit:

ffmpeg -i input.mp4 -lossless 1 output.webm 

Toen ik -lossless 1 probeerde op een mp4, de resulterende webm was 100 × groter, wat geen acceptabel voor mij. Als je mp4 bestanden echter al van zeer hoge kwaliteit zijn, verwacht ik dat het verschil in grootte niet zo groot zal zijn.


Voetnoot 1: Als je “als u Microsoft Windows gebruikt in plaats van UNIX, wijzigt u /dev/null in NUL.

Opmerkingen

  • Goed antwoord bedankt
  • /dev/null? Wat betekent dit? Wat zou het equivalent zijn voor Windows-gebruikers? Overschrijf je input.mp4 bij de eerste doorgang? Dit antwoord heeft meer uitleg nodig over wat elke component precies doet. Het biedt ' niet veel uitleg over hoe het werkt.
  • Hoi Hatefriend: Mijn antwoord bevat al een lange uitlegsectie plus een link voor meer informatie, dus ik ' maak het liever niet langer. Hebt u de voetnoot over Microsoft Windows gezien die uw specifieke vraag beantwoordt en, zoals hierboven vermeld, de eerste pass compi les statistieken over het invoerbestand.U hoeft niet bang te zijn dat het de invoer zou overschrijven.
  • Ik heb geprobeerd het .MTS-bestand naar .webm te converteren met behulp van deze twee opdrachten (Ubuntu 20.10, ffmpeg versie 4.2.2). Maar ik heb fouten: " Ongeldige kanaallay-out 5.1 (zijkant) voor gespecificeerde toewijzingsfamilie -1. Fout bij het initialiseren van uitvoerstroom 0: 1 – Fout bij het openen van encoder voor uitvoerstroom # 0: 1 – mogelijk onjuiste parameters zoals bit_rate, snelheid, breedte of hoogte "
  • bedankt voor het antwoord. als transcodering over het algemeen een slecht idee is, wat raadt u dan aan als u mp4-videos naar webm en webm-videos naar mp4 moet converteren?

Antwoord

Op Linux gebruik ik optimaliserenVideo , een wrapper rond ffmpeg die deze instellingen automatisch detecteert volgens Googles aanbevelingen .

Het resultaat is een video waarvan je het kwaliteitsverschil niet kunt zien, maar meestal orden van grootte kleiner is.

Logo

Geef een reactie

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *