Otrzymywałem tysiące tych ostrzeżeń z określonym kodem. Zmniejszałem rozdzielczość wideo 1080p do 480p. W punkcie edycji, gdzie było jakieś podejrzane wideo z powodu defektu źródłowego dysku laserowego, te wiadomości zaczęły pojawiać się, a następnie pojawiały się, jak sądzę, w każdej następnej klatce. Kontynuowali i ciągnęli, jak ten krótki fragment:
Past duration 0.901115 too large= 535031kB time=00:54:15.06 bitrate=1346.5kbits/s dup=0 drop=19 speed=1.15x
Last message repeated 31 times
Past duration 0.901115 too large= 535031kB time=00:54:15.62 bitrate=1346.3kbits/s dup=0 drop=19 speed=1.15x
Last message repeated 34 times
Past duration 0.901115 too large= 535031kB time=00:54:16.21 bitrate=1346.0kbits/s dup=0 drop=19 speed=1.15x
Last message repeated 36 times
Past duration 0.901115 too large= 535338kB time=00:54:16.83 bitrate=1346.5kbits/s dup=0 drop=19 speed=1.15x
Last message repeated 39 times
Pierwotne wywołanie ffmpeg wyglądało tak:
ffmpeg -i input.mp4 -s 720x480 -c:v libx264 -preset slower -crf 17 -c:a copy -y output.mkv
Zgodnie z sugestiami tutaj najpierw dodałem -framerate 60000/1001 do wejścia. To niczego nie poprawiło. Zachowałem -framerate i dodałem -r 60000/1001 do wyjścia. To nadal niczego nie poprawiło. Zachowując oba, w końcu dodałem -async 1 -vsync 1. Spowodowało to, że otrzymałem jedno ostrzeżenie i to wszystko. To wezwanie brzmiało:
ffmpeg -i input.mp4 -framerate 60000/1001 -s 720x480 -c:v libx264 -preset slower -crf 17 -c:a copy -y output.mkv -r 60000/1001 -async 1 -vsync 1
Jedyną różnicą, jaką znalazłem w szczegółowym zrzucie z MediaInfo, było usunięcie tej linii znalezionej w pierwotnym wywołaniu, ale nie w drugiej:
Delay relative to video : -33ms
Jednak sprawdziłem synchronizację A / V blisko początku plików i pod koniec i nie było zauważalnej różnicy w synchronizacji między dwoma plikami. Ich czasy pracy również były takie same, ale mierzono je tylko z dokładnością do najbliższej sekundy w VLC. Więc sprawdziłem liczbę klatek używając ffmpeg w następujący sposób:
ffmpeg -i output.mkv -map 0:v:0 -c copy -f null -
i szukam "frame = #" pod koniec wyjścia.
Okazuje się, że wideo źródłowe miało długość 375226 klatek, pierwotne wywołanie dało 375195 klatek, a drugie wywołanie 375200. Tak więc drugie wywołanie, ze znacznie mniejszą liczbą komunikatów ostrzegawczych, również porzuciło 5 mniej klatek.
Późniejsze testy wykazały, że -framerate i -r były niepotrzebne, a samo użycie dwóch flag synchronizacji było wystarczające. Dało to identyczne wyniki jak drugie wywołanie powyżej, więc trzecie i najprostsze wywołanie, które znalazłem w celu rozwiązania problemu, jest następujące:
ffmpeg -i input.mp4 -s 720x480 -c:v libx264 -preset slower -crf 17 -c:a copy -y output.mkv -async 1 -vsync 1
I jeszcze inny plik później wygenerował kilka ostrzeżeń nawet z flagami synchronizacji, ale dodanie z powrotem flag szybkości „naprawiło” to (spowodowało tylko dwa zamiast tysięcy ostrzeżeń). Czasami więc drugie wywołanie działa, podczas gdy trzecie nie. Dla moich bezpośrednich celów zamierzam zdecydować się na drugie wezwanie i mam nadzieję, że rozwiąże większość tych problemów.
To wszystko z ffmpeg w wersji 4.0.