Twitch ma post na ten temat. Wyjaśniają, że postanowili skorzystać z własnego programu z kilku powodów; jednym z nich było to, że ffmpeg nie pozwala na uruchamianie różnych instancji x264 w różnych wątkach, ale zamiast tego poświęca wszystkie określone wątki jednej ramce na jednym wyjściu przed przejściem do następnego.
Jeśli nie korzystasz z transmisji strumieniowej w czasie rzeczywistym, masz więcej luksusu. „Prawidłowym” sposobem jest prawdopodobnie zakodowanie w jednej rozdzielczości tylko z rozmiarem GOP określonym za pomocą -g, a następnie zakodowanie innych rozdzielczości wymuszających klatki kluczowe w tych samych miejscach.
Jeśli chcesz to zrobić, możesz użyć ffprobe, aby uzyskać czasy klatki kluczowej, a następnie użyć skryptu powłoki lub rzeczywistego języka programowania, aby przekonwertować to na polecenie ffmpeg.
Jednak w przypadku większości treści różnica między jedną klatką kluczową co 5 sekund a dwiema klatkami kluczowymi co 5 sekund jest bardzo niewielka (jedna wymuszona, a druga ze scenariusza). Jest to około średniego rozmiaru ramki I w porównaniu do rozmiaru ramek P i ramek B. Jeśli używasz x264 z typowymi ustawieniami (jedyny powód, dla którego uważam, że powinieneś zrobić cokolwiek, aby na nie wpłynąć, to ustawienie -qmin, jako zły sposób na zapobieganie używaniu bitrate x264 dla łatwej zawartości; ogranicza to wszystkie typy ramek do tej samej wartości , Tak myślę) i uzyskaj wynik, taki jak średni rozmiar ramki I wynoszący 46 kB, ramkę P 24 kB, ramkę B 17 kB (o połowę częściej niż ramki P), a następnie dodatkową ramkę I co sekundę przy 30 fps to tylko 3% wzrost rozmiaru pliku. Różnica między h264 i h263 może składać się z 3% spadków, ale pojedynczy nie jest bardzo ważny.
W przypadku innych rodzajów treści rozmiary ramek będą się różnić. Szczerze mówiąc, chodzi o złożoność czasową, a nie złożoność przestrzenną, więc nie jest to po prostu łatwa zawartość a twarda treść. Ale ogólnie rzecz biorąc, witryny wideo z transmisją strumieniową mają limit bitrate, a treść ze stosunkowo dużymi ramkami I jest łatwą treścią, która będzie kodowana w wysokiej jakości bez względu na to, ile dodatkowych klatek kluczowych zostanie dodanych. To marnotrawstwo, ale marnotrawstwo zwykle nie zostanie zauważone. Najbardziej marnotrawnym przypadkiem jest prawdopodobnie wideo, które jest statycznym obrazem towarzyszącym utworowi, w którym każda klatka kluczowa jest dokładnie taka sama.
Jednej rzeczy, której nie jestem pewien, to jak wymuszone klatki kluczowe współdziałają z ogranicznikiem prędkości ustawionym za pomocą opcji -maxrate i -bufsize. Myślę, że nawet YouTube miał ostatnio problemy z prawidłową konfiguracją ustawień bufora, aby zapewnić stałą jakość. Jeśli używasz tylko średnich ustawień szybkości transmisji bitów, co widać na niektórych stronach (ponieważ możesz sprawdzić opcje x264 w nagłówku / mov atom? Za pomocą edytora szesnastkowego), to model bufora nie stanowi problemu, ale jeśli jesteś wyświetlając treści generowane przez użytkowników, średnia szybkość transmisji zachęca użytkowników do dodania czarnego ekranu na końcu filmu.
Opcja -g Ffmpeg lub dowolna inna używana opcja enkodera jest mapowana na opcję specyficzną dla enkodera. Zatem „-x264-params keyint = GOPSIZE” jest równoważne „-g GOPSIZE”.
Jednym z problemów z używaniem wykrywania scen jest to, że wolisz klatki kluczowe w pobliżu określonych liczb z jakiegokolwiek powodu. Jeśli określisz klatki kluczowe co 5 sekund i użyjesz wykrywania scen, a nastąpi zmiana sceny na 4.5, to powinna zostać wykryta, ale następna klatka kluczowa będzie na 9.5. Jeśli czas będzie się zwiększał w ten sposób, możesz skończyć z klatkami kluczowymi w 42,5, 47,5, 52,5 itd. Zamiast 40, 45, 50, 55. I odwrotnie, jeśli nastąpi zmiana sceny w 5.5, to będzie klatka kluczowa w 5 i 5,5 będzie za wcześnie na kolejną. Ffmpeg nie pozwala na określenie „utwórz tutaj klatkę kluczową, jeśli nie nastąpi zmiana sceny w ciągu następnych 30 klatek”. Jednak ktoś, kto rozumie C, może dodać tę opcję.
W przypadku wideo o zmiennej liczbie klatek na sekundę, gdy nie korzystasz z transmisji strumieniowej na żywo, takiej jak Twitch, powinieneś być w stanie korzystać ze zmian scen bez ciągłej konwersji na stałą częstotliwość klatek. Jeśli użyjesz filtru „select” w ffmpeg i użyjesz stałej „scene” w wyrażeniu, wówczas dane wyjściowe debugowania (-v debugowania lub naciśnij kilkakrotnie „+” podczas kodowania) pokazują numer zmiany sceny. Prawdopodobnie różni się to od liczby używanej przez x264 i nie jest tak przydatne, ale może być nadal przydatne.
Procedura prawdopodobnie polegałaby na zrobieniu filmu testowego, który dotyczyłby tylko zmian klatki kluczowej, ale może być wykorzystany do kontroli prędkości transmisji danych, jeśli używany jest 2-przebieg. (Nie jestem pewien, czy wygenerowane dane są w ogóle przydatne dla różnych rozdzielczości i ustawień; dane drzewa makrobloków nie będą.) Konwertuj je na wideo o stałej szybkości klatek, ale zobacz ten błąd dotyczący zacinania się wyjścia podczas zmniejszania liczby klatek na sekundę, jeśli kiedykolwiek zdecydujesz użyć filtra fps do innych celów. Uruchom go przez x264 z wybraną klatką kluczową i ustawieniami GOP.
Następnie użyj tych czasów klatek kluczowych z oryginalnym wideo o zmiennej liczbie klatek na sekundę.
Jeśli dopuścisz całkowicie szaloną zawartość generowaną przez użytkownika z 20-sekundową przerwą między ramkami, to w przypadku kodowania ze zmienną liczbą klatek na sekundę możesz podzielić dane wyjściowe, użyć filtra fps, w jakiś sposób użyć filtra select (być może zbudować naprawdę długie wyrażenie, które ma za każdym razem klatki kluczowej) ... a może możesz użyć testowego wideo jako wejścia i albo dekodować tylko klatki kluczowe, jeśli ta opcja ffmpeg działa, lub użyj filtra wyboru, aby wybrać klatki kluczowe. Następnie przeskaluj go do odpowiedniego rozmiaru (istnieje nawet filtr scale2ref) i nałóż na niego oryginalny film. Następnie użyj filtra przeplotu, aby połączyć te przeznaczone do wymuszenia klatki kluczowe z oryginalnym wideo. Jeśli wynikiem tego są dwie ramki, które są w odległości 0,001 s od siebie, że filtr przeplotu nie zapobiega, rozwiąż ten problem sam z innym wybranym filtrem. Głównym problemem może być obsługa limitów bufora ramki dla filtra przeplotu. Wszystko to może działać: użyć jakiegoś filtra do buforowania gęstszego strumienia (filtr FIFO?); odwołać się do pliku wejściowego wiele razy, więc jest dekodowany więcej niż jeden raz, a ramki nie muszą być przechowywane; użyj filtru „streamselect”, czego nigdy wcześniej nie robiłem, dokładnie w czasach klatek kluczowych; popraw filtr przeplotu, zmieniając jego domyślne zachowanie lub dodając opcję wyświetlania najstarszej ramki w buforze zamiast upuszczania ramki. czego nigdy nie zrobiłem, dokładnie w czasach klatek kluczowych; popraw filtr przeplotu, zmieniając jego domyślne zachowanie lub dodając opcję wyświetlania najstarszej ramki w buforze zamiast upuszczania ramki. czego nigdy nie zrobiłem, dokładnie w czasach klatek kluczowych; popraw filtr przeplotu, zmieniając jego domyślne zachowanie lub dodając opcję wyświetlania najstarszej ramki w buforze zamiast upuszczania ramki.