Jak rozważać bitrate, -maxrate i -bufsize wideo dla Internetu

13

Używam ffmpeg do kodowania moich filmów w celu przesłania ich do Internetu. Widziałem ten post na temat używania ffmpeg, ale nie bardzo rozumiałem, jak brać pod uwagę wartości.

Załóżmy, że mam film o rozmiarze 70 MB, który trwa 4 minuty. Jak bym rozważyć wartość dla tych flag: -b:v, -maxratei -bufsizedla tego polecenia?

ffmpeg -i input -codec:v libx264 -profile:v main -preset slow -b:v ? -maxrate ? -bufsize ? -vf "scale=720:trunc(ow/a/2)*2" -threads 0 -codec:a libfdk_aac -movflags +faststart output

A może jest jakaś normalna wartość, na przykład dla crfwartości 19–24? Byłbym bardzo wdzięczny za twoją pomoc i wskazówki.

Rudzik
źródło
Kodowanie wideo to sztuka, a do opanowania są setki parametrów. Zauważ, że kodowanie dwuprzebiegowe zapewni (znacznie) lepszą jakość i kompresję w większości scenariuszy niż zabawa z przepływnością. Zwykle ostateczny rozmiar i szybkość transmisji wideo zależy głównie od wielkości wyjściowej wideo. ffmpeg jest zazwyczaj wystarczająco inteligentny, aby wybrać maksymalną szybkość transmisji i szybkość transmisji bitów, jeśli powiesz jej, aby zachowała tę samą jakość wideo. Zauważ też, że utworzenie wideo o szerokości 480px jest wystarczające w większości scenariuszy, a to pozwoli zaoszczędzić znacznie więcej przepustowości niż gra z przepływnością.
earizon
1
@earizon Zgadzam się, kodowanie wideo jest sztuką, a 480 jest zwykle wystarczająco dobre. Lubię też mieć dostępną wyższą rozdzielczość, ponieważ nie używam już CRT o rozdzielczości 640x480. Jest to zdecydowanie lepszy sposób na zmniejszenie rozmiarów niż manipulowanie bitrate, ale znowu lubię opcje.
Wyatt8740,

Odpowiedzi:

21

To zależy od prędkości wysyłania.

bufsizeokreśli, jak religijna ffmpeg polega na utrzymywaniu stałej przepływności. Jeśli ustawisz wartość bufsize64k, zgodnie z Wiki FFmpeg: Ograniczanie wyjściowej przepływności , będzie obliczać jej bieżącą przepływność co 64 kilobajty i odpowiednio dostosowywać. Mniejsze rozmiary dla bufsizemogą być szkodliwe dla jakości, ponieważ nie pozwalają wystarczająco dużo miejsca między sprawdzeniami dla x264, aby dokonać nagłych zmian - dostaniesz blokadę.

Jeśli twój maxratejest 640kbps, a twój bufsizejest 64k, wtedy sprawdzałaby się co dziesiąta część x264. Jest to nieoptymalne - FFmpeg Wiki: Kodowanie dla stron streamingowych zaleca się uruchamianie go co 1-2 sekundy. Jeśli to nie miało sensu, pomyśl o tym jako maxrate/ bufsize= częstotliwość kontroli. Zachowaj tę częstotliwość od 1 do 2 sekund z reguły.

Jeśli ustawisz oba maxratei bufsize, powinieneś:

  • ustawioną maxratena najniższą możliwą prędkość wysyłania (w przykładzie wiki ffmpeg jest to 80% całkowitej prędkości wysyłania, ale przebieg może się różnić).
  • ustaw bufsizegdzieś pomiędzy tym samym co twoja maxrate(jedna sekunda) i dwa razy maxrate(2 sekundy). Jeśli nadal nie jest wystarczająco niski, obniż swój, maxratea następnie odpowiednio go zresetuj bufsize.

Potem będziesz musiał się trochę pobawić, ale skoro musisz gdzieś zacząć, zacznę od maxrateokoło 600 000, co zwykle wystarczało mi z powrotem, zanim wykorzystałem crfwszystko.

Jeśli chcesz, możesz wypróbować niższe wartości bufsize, na przykład co trzy lub cztery sekundy, aby zobaczyć, jak ta wartość zmienia wygląd twojego wyniku. Następnie możesz określić, jak bardzo powinieneś się tym martwić w swoim filmie.

Naprawdę nie ma żadnej wartości normalnej - crfchodzi o to, aby zoptymalizować wyjście w oparciu o to, co według niego jest najlepszym rozmiarem bufora do utrzymania tego, co jest ustawione na jego szybkość. Stara się zachować tak mały rozmiar pliku, zachowując pewną jakość, kosztem okazjonalnych skoków.

Wyatt8740
źródło
1
Nie powinno się „ustawiać bufsize na wartość między tym samym co maksymalny (jedna sekunda) a połową maksymalnego limitu (2 sekundy)” nie powinna sekundy)" ?
Ely,
@ Ely Myślę, że masz rację. Mój robiłby to co pół sekundy. Naprawię to!
Wyatt8740
@ Wyatt8740 Przepraszam, byłem bardzo zajęty. Tylko jedno pytanie. Jeśli używam crf, to nie muszę określać bitrate, buffsizea maxrate? A jeśli tak, to co jest bardziej wydajne (użyj crflub bitrate, buffsizei maxrate)?
Robin
@Robin Możesz używać bufsize i maxrate z crf. Pamiętaj, że CRF dostosuje bitrate w locie do określonej jakości, a jeśli fragmenty filmu są bardzo złożone, bitrate będzie strzelać do nieba i prawdopodobnie tego nie chcesz, więc lepiej „zablokuj” za pomocą bufsize i maxrate (ale niezbyt surowe, bo inaczej wideo będzie wyglądać jak gówno! :))
Ely
@ Robin poprawnie, nie powinieneś używać CRF z innymi. Możesz jednak, jeśli chcesz to ograniczyć. CRF stara się utrzymać stałą jakość - możesz to zmusić do tego w granicach przy pomocy bufsizei maxrate. bitrateAle nie potrzebujesz . Jak powiedział Ely, poprawi to strumieniowanie.
Wyatt8740,