Podczas kodowania H.264 przy użyciu ffmpeg otrzymuję masowo następujące typy ostrzeżeń:
Past duration 0.603386 too large
Past duration 0.614372 too large
Past duration 0.606377 too large
Co mieli na myśli? Nie znalazłem niczego jasnego w Internecie ani w dokumentacji ffmpeg.
Odpowiedzi:
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:
Pierwotne wywołanie ffmpeg wyglądało tak:
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:
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:
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:
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:
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.
źródło
-async 1 -vsync 1
naprawiłem to za mnie.Jeden z opiekunów dla projektu na SourceForge DVDStyler powiedział to o tym:
źródło
Ten komunikat ostrzegawczy pojawia się podczas próby zakodowania źródła o dużej szybkości klatek na wyjście o niskiej liczbie klatek, co oznacza, że klatki muszą zostać odrzucone.
Wystąpił ten błąd, ponieważ chciałem przekonwertować serię obrazów na wideo:
Wydaje się, że problem polega na tym, że jeśli na wejściu nie podano liczby klatek na sekundę, przyjmuje się liczbę klatek na sekundę 25 kl./s:
Można to również zobaczyć na podstawie całkowitej liczby zakodowanych ramek. Miałem 400 obrazów, ale powyższe polecenie zakodowało tylko 384:
Komunikaty o błędach znikają, ustawiając zamiast tego wejściową częstotliwość odświeżania, jeśli wyjściowa liczba klatek na sekundę. Szybkość klatek wyjściowych zostanie wtedy automatycznie wybrana jako częstotliwość wejściowa. Dodatkowo w nowszych wersjach ffmpeg musisz uważać, ponieważ używając obrazów PNG z
-i
opcją lub raczej formatem wejściowymimage2
lubv4l2
, musisz użyć-framerate
zamiast-r
, zapoznaj się z dokumentacją-r
opcji .Możliwe jest również osobne określenie liczby klatek na sekundę wejścia i wyjścia:
W tym przypadku zakodowanych zostanie tylko 161/400 ramek. Pozostałe ramki zostaną tymczasowo usunięte. Znika również komunikat o błędzie, myślę, że aby nie spowalniać ffmpeg przez spamowanie na standardowe wyjście, zobacz:
źródło
-r
działało tam, gdzie-framerate
nie było.ffmpeg -pattern_type glob -i '*.jpg' -filter:v "setpts=0.25*PTS" -r 50 "$( date "+%Y-%m-%d_%H%M%S")-timelapse-x4-50fps.mp4"
bez ostrzeżeniaffmpeg -framerate 50 -pattern_type glob -i '*.jpg' -filter:v "setpts=0.25*PTS" -r 50 "$( date "+%Y-%m-%d_%H%M%S")-timelapse-x4-50fps.mp4"
(zwróć uwagę na-framerate 50
dodane do wejścia)Patrząc na kod źródłowy , wydaje się, że różnica między czasem prezentacji (pkt.) W strumieniu wejściowym różni się od tego w strumieniu wyjściowym o więcej niż ustalony limit ustawiony na 0,6.
Fragmenty ze źródła:
...
To tylko szybki rzut oka, więc nie krępuj się poszukać głębiej.
źródło
format_video_sync = VSYNC_DROP
lubformat_video_sync = VSYNC_PASSTHROUGH
sprawdzić, czy któryś z nich jest wykonalny w twoim przypadku użycia.-r
przełącznika „naprawiono” te ostrzeżenia.Zgodnie z numerem 4700 FFmpeg - przeszły czas trwania 0,999992 za duży, jest to tylko ostrzeżenie. Posługiwać się:
Żeby to zatrzymać.
Ned
źródło
Polecenie powinno faktycznie wyglądać tak:
Nie ma przedrostka „-” dla parametru „cichy”, ponieważ nie jest to opcja, a raczej wartość opcji „-loglevel”.
źródło