Jak mogę uzyskać czas trwania filmu w kilka sekund?
Co próbowałem:
ffmpeg -i file.flv 2>&1 | grep "Duration"
Duration: 00:39:43.08, start: 0.040000, bitrate: 386 kb/s
mediainfo file.flv | grep Duration
Duration : 39mn 43s
To, co jest blisko, ale nie jest tak dokładne, 2383 to 39,71 minuty
ffmpeg -i file.flv 2>&1 | grep "Duration"| cut -d ' ' -f 4 | sed s/,// | sed 's@\..*@@g' | awk '{ split($1, A, ":"); split(A[3], B, "."); print 3600*A[1] + 60*A[2] + B[1] }'
2383
Odpowiedzi:
Aby uzyskać minuty, musisz podzielić 2383 sekundy przez 60.
a następnie pomnóż część ułamkową .7167 przez 60, aby uzyskać pozostałe sekundy.
To 39 minut, 43 sekundy. Wygląda na to, że aplikacja podaje dokładną wartość.
źródło
Po prostu użyj
ffprobe
bezpośrednio. Nie ma potrzebysed
,grep
itp Istnieje kilka „okresy” można nabyć (w zależności od wejścia).Czas trwania formatu (kontenera)
Dodanie
-sexagesimal
opcji spowoduje użycie formatu jednostki czasu HOURS: MM: SS.MICROSECONDS:Czas trwania strumienia wideo
Powyższe polecenia pochodzą z FFmpeg Wiki: FFprobe Tips .
Z
ffmpeg
Konieczne może być całkowite odkodowanie danych wejściowych, jeśli okaże się, że brakuje kontenera lub czasu trwania strumienia lub jest on niedokładny (być może z powodu uszkodzonego lub obciętego pliku).
W tym przykładzie
time=00:01:03.48
jest czas trwania:To, jak długo to zajmie, zależy oczywiście od złożoności dekodowania i czasu trwania danych wejściowych oraz możliwości komputera.
źródło
ffmpeg
”.Jeśli masz
ffmpeg
, powinieneś również miećffprobe
:To da również ułamki sekund, jeśli jest to problem, możesz dalej go przetwarzać za pomocą sed.
źródło
printf
, na przykład| xargs printf %.0f
- to zwróci wartość całkowitą.Dla mojego ffmpeg-0.6.5-1.el6.rf.x86_64, aby uzyskać tylko drugi, format polecenia ffprobe to:
źródło
Rozwiązanie z mplayerem, które daje sekundy bezpośrednio:
źródło
To wyświetla czas trwania w milisekundach jako jedną wartość całkowitą. Nie ma potrzeby grep / cut / sed / ...
źródło
brew install mediainfo
Natknąłem się na problem uzyskiwania dziwnych i niepoprawnych metadanych z niektórych plików wideo, z którymi pracowałem i nie udało mi się znaleźć wzorca lub innego rodzaju obsługi za pomocą kodu i narzędzi takich jak ffmpeg, mp4box, ffprobe, mediainfo, mplayer, aby uzyskać rzeczywisty czas trwania filmu.
Określenie rzeczywistego czasu trwania wideo było wymaganiem dla projektu, nad którym pracowałem, a jedynym sposobem, aby uzyskać go zawsze poprawnie, było ponowne kodowanie pliku wideo przy użyciu ffmpeg i zmuszanie kodowanych plików do ignorowania metadanych oryginalnego pliku, takich jak:
(Może to działać szybciej, niż się spodziewasz. Zaskoczyło mnie to, ze względu na rodzaj zawartości i środowisko, z którego korzystałem, średni czas wynosił 2 sekundy)
... a następnie uzyskaj czas trwania za pomocą wybranego narzędzia. Lubię mediainfo, btw: - "PLIK mediainfo - Informacje =" Wideo;% Duration% "daje ci czas trwania w milisekundach.
źródło
Jeśli potrzebujesz tylko zapytać o metadane:
[...]
[...]
Możesz to parsować:
Ale jeśli chcesz uzyskać efektywny czas trwania kontenera, musisz go zdekodować:
Dekodowanie zajmie trochę czasu procesora, dopóki:
[...]
Następnie możesz go przeanalizować:
źródło
Jeśli chcesz mieć DOKŁADNY czas trwania, zapomnij o FFmpeg. Podaje jedynie oszacowanie na podstawie rozmiaru pliku i średniej przepływności. Znalazłem, w niektórych przypadkach, szacowany czas wolny od pracy 2x!
W systemie Linux, jeśli plik jest tworzony i modyfikowany tylko podczas wspomnianego nagrania wideo, alternatywnym rozwiązaniem byłoby użycie czasu utworzenia i ostatniej modyfikacji do obliczenia czasu trwania, jak w:
źródło