Hvad er den bedste måde at konvertere en mp4 -fil til webm uden kvalitetstab (ved hjælp af vp8 eller vp9) med ffmpeg?

Hvis jeg gør ffmpeg -i in.mp4 out.webm, er kvaliteten meget dårlig. Jeg kan specificere en målbithastighed via -b:v og konstant kvalitetstilstand via crf, dvs.

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

Dette giver bedre kvalitet. Men til dette er jeg nødt til at slå op på bithastigheden af inputvideoen (her 1M).

Jeg bemærkede også, at hvis du angiver en meget større værdi for målbithastigheden end inputhastigheden (her f.eks. -b:v 100M), synes ffmpeg bare at brug omtrent bitrate fra inputvideoen med vp9 eller lidt højere bitrate med vp8. Denne løsning ser imidlertid ikke ud til at være den tilsigtede måde at gøre dette på.

Hvordan vælger du crf-værdien og hvorfor?

Er der en parameter, der automatisk vælger bitrate på inputfilen og en passende crf-værdi for at få den samme kvalitet som inputfilen?

Kommentarer

  • Sæt bitrate til 0. Og eksperimenter med crf Men din metode til høj bithastighed fungerer også, da værdien fungerer som et loft ikke et mål
  • @Mulvya: Betyder bithastighed 0, at der ikke er nogen grænse? Jeg gjorde ikke ' Find ikke dette på mandsiden.
  • Med bithastighed ikke sat til nul er CRF begrænset af denne værdi. Med nul er det ' s ikke. Det ' er en quirk af VPn-koderne.
  • Ok, men hvis jeg udelader bitrate-parameteren fuldstændigt, bliver kvaliteten meget dårlig, selvom jeg ikke gjorde ' t giver en øvre grænse for bithastigheden.
  • Link til 200k (se første opti på). For WebM b: v 0, se denne side .

Svar

Svar

Brug to-pass-konstant kvalitetstilstand: ¹

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:

Ved at indstille videobithastigheden til nul mens du også specificerer CRF (Constant Rate Factor), aktiveres konstant kvalitetstilstand, der målretter mod et bestemt perceptuelt kvalitetsniveau. For VP9 kan CRF variere fra 0 (bedste kvalitet) til 63 (mindste filstørrelse).

Det er vigtigt at indstille videobithastigheden til nul. Hvis du ikke angiver en video-bithastighed, er den som standard noget lavt, der får dig Begrænset Kvalitetstilstand, hvor hver ramme har en maksimal bithastighed. Selvom det kan være nyttigt til streaming, reducerer det kvaliteten markant, da rammer med meget bevægelse ikke har den nødvendige båndbredde for at se godt ud.

En anden del af grunden til at du mister kvalitet er, at webm (VP9) foretrækker at kode i to gennemløb for at opnå de bedste resultater. Det første pass samler statistik om videoen, som derefter bruges i det andet pass til at lave en mindre og højere kvalitetsvideo.

Se ffmpeg VP9-dokumentationen hvis du gerne vil vide mere.

Et ord om transkodning

Generelt set transcoding-formater (tager en komprimeret video og komprimerer den igen med en forskellige codec) er en dårlig idé, da du ikke kun tilføjer de normale fejl fra tabsfri videokodning, men du spilder bits i det nye format og prøver at bevare artefakterne fra det gamle.

Hvis du betyder “uden kvalitetstab” bogstaveligt talt

-lossless 1 -muligheden for ffmpegs VP9-koder muliggør tabsfri kvalitetstilstand, men med en potentielt enorm stigning i filstørrelse.

Alt hvad du behøver er dette:

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

Da jeg prøvede -lossless 1 på en lav kvalitet mp4, den resulterende webm var 100 × større, hvilket ikke var en cceptabelt for mig. Hvis dine mp4 filer allerede er af meget høj kvalitet, forventer jeg dog, at størrelsesforskellen ikke vil være så stor.


Fodnote 1: Hvis du “bruger Microsoft Windows i stedet for UNIX, skal du ændre /dev/null til NUL.

Kommentarer

  • Fantastisk svar tak
  • /dev/null? Hvad betyder det? Hvad ville ækvivalenten være for Windows-brugere? Overskriver du input.mp4 i første omgang? Dette svar kræver mere forklaring på, hvad hver enkelt komponent gør. Det giver ' t mellemliggende brugere meget forklaring på hvordan det fungerer.
  • Hej Hatefriend: Mit svar indeholder allerede et langt forklaringsafsnit plus et link for mere information, så jeg ' vil hellere ikke gøre det længere. Så du fodnoten vedrørende Microsoft Windows, som svarer på dit specifikke spørgsmål? Som nævnt ovenfor, den første pass compi les statistik om inputfilen.Der er ingen grund til at frygte, at det kan overskrive input.
  • Jeg prøvede at konvertere .MTS-fil til .webm bruge disse to kommandoer (Ubuntu 20.10, ffmpeg version 4.2.2). Men jeg har fået fejl: " Ugyldigt kanallayout 5.1 (side) for specificeret kortlægningsfamilie -1. Fejl ved initialisering af outputstrøm 0: 1 – Fejl under åbning af encoder til outputstrøm nr. 0: 1 – måske forkerte parametre som bitrate, hastighed, bredde eller højde "
  • tak for svaret. hvis kodning generelt er en dårlig idé, hvad anbefaler du i stedet, hvis du har brug for at konvertere mp4-videoer til webm og webm-videoer til mp4?

Svar

På Linux bruger jeg optimizeVideo , som er en indpakning omkring ffmpeg, der automatisk registrerer disse indstillinger i henhold til Googles anbefalinger .

Resultatet er en video, hvilken kvalitetsforskel du ikke kan se, men normalt størrelsesordener mindre.

Logo

Skriv et svar

Din e-mailadresse vil ikke blive publiceret. Krævede felter er markeret med *