Vad är det bästa sättet att konvertera en mp4
-fil till webm
utan kvalitetsförlust (med vp8
eller vp9
) med ffmpeg?
Om jag gör ffmpeg -i in.mp4 out.webm
är kvaliteten mycket dålig. Jag kan ange en målbithastighet via -b:v
och läget för konstant kvalitet via crf
, dvs
ffmpeg -i in.mp4 -crf 10 -b:v 1M out.webm
Detta ger bättre kvalitet. Men för detta måste jag slå upp bithastigheten för ingångsvideon (här 1M).
Jag märkte också att om du anger ett mycket större värde för målbithastigheten än bithastigheten för ingången (här till exempel -b:v 100M
), verkar ffmpeg bara använd ungefär bithastigheten från ingångsvideon med vp9 eller något högre bithastighet med vp8. Denna lösning verkar dock inte vara det avsedda sättet att göra detta.
Hur skulle du välja crf-värdet och varför?
Finns det en parameter som automatiskt väljer bithastigheten för inmatningsfilen och ett lämpligt CRF-värde för att få samma kvalitet som inmatningsfilen?
Kommentarer
- Ställ in bitrate till 0. Och experimentera med crf Men din metod för hög bithastighet fungerar också, eftersom värdet fungerar som ett tak inte ett mål
- @Mulvya: Betyder bithastighet 0 att det inte finns någon gräns? Jag ' hittar inte detta på mansidan.
- Med bithastighet inte satt till noll begränsas CRF av det värdet. Med noll är det ' s inte. Det ' är en egendom för VPn-kodarna.
- Okej, men om jag utelämnar bitrate-parametern blir kvaliteten väldigt dålig även om jag inte gjorde ' t ger en övre gräns för bithastigheten.
- Länk för 200k (se första opti på). För WebM b: v 0, se denna sida .
Svar
Svar
Använd två-pass-läget för konstant kvalitet: ¹
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
Förklaring:
Om du ställer in videobitfrekvensen till noll samtidigt som du anger CRF (Constant Rate Factor) aktiveras läget för konstant kvalitet som riktar sig mot en viss kvalitetsnivå. För VP9 kan CRF variera från 0 (bästa kvalitet) till 63 (minsta filstorlek).
Det är viktigt att ställa in videobitfrekvensen till noll. Om du inte anger en videobithastighet, är den som standard något låg som får dig Begränsad Kvalitetsläge, där varje bildruta har en maximal bithastighet. Även om det kan vara användbart för streaming, minskar det kvaliteten betydligt eftersom ramar med mycket rörelse inte har den bandbredd som behövs för att se bra ut.
En annan del av anledningen till att du tappar kvalitet är att webm
(VP9) föredrar att koda i två pass för bästa resultat. Det första passet sammanställer statistik om videon som sedan används i det andra passet för att skapa en mindre och högre kvalitetvideo.
Se ffmpeg VP9-dokumentationen om du vill lära dig mer.
Ett ord om omkodning
Förresten, i allmänhet, omkodningsformat (ta en komprimerad video och komprimera den igen med en olika codec) är en dålig idé eftersom du inte bara lägger till de vanliga felen från förlust av videokodning, utan att du slösar bort bitar i det nya formatet och försöker bevara artefakterna från det gamla.
Om du menar “utan kvalitetsförlust” bokstavligen
-lossless 1
-alternativet för ffmpegs VP9-kodare möjliggör förlustfritt kvalitetsläge, men med en potentiellt enorm ökning av filstorlek.
Allt du behöver är detta:
ffmpeg -i input.mp4 -lossless 1 output.webm
När jag försökte -lossless 1
på en lågkvalitativ mp4
, den resulterande webm
var 100 × större, vilket inte var för mig. Om dina mp4
-filer redan är av mycket hög kvalitet, förväntar jag mig att storleksskillnaden inte kommer att vara så stor.
Fotnot 1: Om du ”använder Microsoft Windows istället för UNIX, ändra /dev/null
till NUL
.
Kommentarer
- Bra svar tack
-
/dev/null
? Vad betyder detta? Vad skulle motsvarigheten vara för Windows-användare? Skrivar du överinput.mp4
vid första passet? Detta svar behöver mer förklaring om vad exakt varje komponent gör. Det ' t ger mellananvändare mycket förklaring till hur det fungerar. - Hej Hatefriend: Mitt svar innehåller redan ett långt förklaringsavsnitt plus en länk för mer information, så jag ' vill inte göra det längre. Såg du fotnot om Microsoft Windows som svarar på din specifika fråga? Som nämnts ovan, den första pass compi les statistik om inmatningsfilen.Det finns ingen anledning att frukta att det kan skriva över inmatningen.
- Jag försökte konvertera .MTS-fil till .webm använda dessa två kommandon (Ubuntu 20.10, ffmpeg version 4.2.2). Men jag har fel: " Ogiltig kanallayout 5.1 (sida) för angiven mappfamilj -1. Fel vid initialisering av utgångsström 0: 1 – Fel vid öppning av kodare för utdataström nr 0: 1 – kanske felaktiga parametrar som bitrate, hastighet, bredd eller höjd "
- tack för svaret. om kodning i allmänhet är en dålig idé, vad rekommenderar du istället om du behöver konvertera mp4-videor till webm och webm-videor till mp4?
Svar
På Linux använder jag optimizeVideo , vilket är ett omslag runt ffmpeg som automatiskt upptäcker dessa inställningar enligt Googles rekommendationer .
Resultatet är en video vilken kvalitetsskillnad du inte kan säga, men vanligtvis storleksordningar mindre.