Hva er den beste måten å konvertere en mp4
-fil til webm
uten tap av kvalitet (bruker vp8
eller vp9
) med ffmpeg?
Hvis jeg gjør ffmpeg -i in.mp4 out.webm
, er kvaliteten veldig dårlig. Jeg kan spesifisere en målhastighet via -b:v
og konstant kvalitetsmodus via crf
, dvs.
ffmpeg -i in.mp4 -crf 10 -b:v 1M out.webm
Dette gir bedre kvalitet. Men for dette må jeg slå opp bithastigheten til inngangsvideoen (her 1M).
Jeg la også merke til at hvis du spesifiserer en mye større verdi for målhastigheten enn bithastigheten til inngangen (her for eksempel -b:v 100M
), synes ffmpeg bare å bruk omtrent bithastigheten fra inngangsvideoen med vp9 eller litt høyere bithastighet med vp8. Imidlertid ser ikke denne løsningen ut til å være den tiltenkte måten å gjøre dette på.
Hvordan vil du velge crf-verdien og hvorfor?
Er det en parameter som automatisk velger bithastigheten til inndatafilen og en passende crf-verdi for å få samme kvalitet som inndatafilen?
Kommentarer
- Sett bithastighet til 0. Og eksperimenter med crf Men metoden din med høy bithastighet fungerer også, siden verdien fungerer som et tak, ikke et mål
- @Mulvya: Betyr bitrate 0 at det ikke er noen grense? Jeg gjorde ikke ' t finner dette på mansiden.
- Med bithastighet ikke satt til null, er CRF begrenset av den verdien. Med null ' s ikke. Det ' er en særegenhet for VPn-koderne.
- Ok, men hvis jeg utelater bitrate-parameteren helt, blir kvaliteten veldig dårlig, selv om jeg ikke gjorde det ' t gi en øvre grense for bithastigheten.
- Link for 200k (se første opti på). For WebM b: v 0, se denne siden .
Svar
Svar
Bruk to-passers konstantkvalitetsmodus: ¹
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
Forklaring:
Hvis du setter videobithastigheten til null mens du også spesifiserer CRF (Constant Rate Factor), aktiveres Constant Quality-modus som retter seg mot et bestemt perseptuelt kvalitetsnivå. For VP9 kan CRF variere fra 0 (beste kvalitet) til 63 (minste filstørrelse).
Det er viktig å sette videohastigheten til null. Hvis du ikke spesifiserer en videobithastighet, er den som standard noe lavt som gir deg Begrenset Kvalitetsmodus, der hver ramme har maksimal bithastighet. Selv om det kan være nyttig for streaming, reduserer det kvaliteten betydelig da rammer med mye bevegelse ikke vil ha båndbredden som trengs for å se bra ut.
En annen del av årsaken til at du mister kvalitet er at webm
(VP9) foretrekker å kode i to passeringer for best resultat. Det første passet samler statistikk om videoen, som deretter brukes i det andre passet for å lage en mindre og høyere video.
Se ffmpeg VP9-dokumentasjonen hvis du vil lære mer.
Et ord om transkoding
For øvrig, generelt, transkodingsformater (ta en komprimert video og komprimere den med en forskjellig kodek) er en dårlig ide, ettersom du ikke bare legger til de normale feilene fra tapsfri videokoding, men du vil kaste bort biter i det nye formatet og prøve å bevare gjenstandene fra det gamle.
Hvis du betyr «uten kvalitetstap» bokstavelig talt
-lossless 1
-alternativet til ffmpegs VP9-koder muliggjør tapsfri kvalitetsmodus, men med en potensielt enorm økning i filstørrelse.
Alt du trenger er dette:
ffmpeg -i input.mp4 -lossless 1 output.webm
Da jeg prøvde -lossless 1
på en lav kvalitet mp4
, den resulterende webm
var 100 × større, som ikke var en godt for meg. Hvis mp4
-filene dine allerede er av høy kvalitet, forventer jeg imidlertid at størrelsesforskjellen ikke vil være så stor.
Fotnote 1: Hvis du «bruker Microsoft Windows i stedet for UNIX, endrer /dev/null
til NUL
.
Kommentarer
- Flott svar takk
-
/dev/null
? Hva betyr dette? Hva ville ekvivalenten være for Windows-brukere? Overskriver duinput.mp4
i første omgang? Dette svaret trenger mer forklaring på hva akkurat hver komponent gjør. Det ' t gir mellombrukere mye forklaring på hvordan det fungerer. - Hei Hatefriend: Svaret mitt inneholder allerede en lang forklaringsseksjon pluss en lenke for mer informasjon, så jeg ' vil heller ikke gjøre det lenger. Så du fotnoten om Microsoft Windows som svarer på det spesifikke spørsmålet ditt? Som nevnt ovenfor, den første pass compi les statistikk om inndatafilen.Det er ikke nødvendig å frykte at det kan overskrive inndataene.
- Jeg prøvde å konvertere .MTS-fil til .webm bruker disse to kommandoene (Ubuntu 20.10, ffmpeg versjon 4.2.2). Men jeg har feil: " Ugyldig kanaloppsett 5.1 (side) for spesifisert kartfamilie -1. Feil ved initialisering av utgangsstrøm 0: 1 – Feil under åpning av koder for utgangsstrøm nr. 0: 1 – kanskje feil parametere som bitrate, hastighet, bredde eller høyde "
- takk for svaret. Hvis koding generelt er en dårlig ide, hva anbefaler du i stedet hvis du trenger å konvertere mp4-videoer til webm og webm-videoer til mp4?
Svar
På Linux bruker jeg optimizeVideo , som er en wrapper rundt ffmpeg som automatisk oppdager disse innstillingene i henhold til Googles anbefalinger .
Resultatet er en video hvilken kvalitetsforskjell du ikke kan se, men vanligvis størrelsesorden mindre.