Mam plik wideo i chcę uzyskać liczbę klatek wideo, które się w nim znajdują. Mogę użyć, ffmpeg
aby uzyskać długość filmu i FPS. Jednak nie widzę nic oczywistego dla całkowitej liczby ramek.
Teoretycznie należy mieć możliwość pomnożenia długości (w sekundach) przez liczbę klatek na sekundę, aby uzyskać liczbę klatek, ale w tym przypadku długość (34,43 sekundy) i liczba klatek na sekundę (29,97 kl./s) dają liczbę całkowitą, co czyni mnie myślę, że robię coś złego.
Muszę być w stanie to zrobić w wierszu poleceń w całkowicie zautomatyzowany i nie graficzny sposób. Potrzebuję również, aby było to dość dokładne, a nie szacunkowe (jeśli jest to nawet możliwe w przypadku plików wideo)
Próbowałem użyć tcprobe
niektórych plików. W przypadku niektórych plików AVI to działa, ale w przypadku niektórych plików VOB wyjście tcprobe nie ma liczby ramek. Otrzymuję ten wynik:
[tcprobe] MPEG program stream (PS)
[tcprobe] summary for myfile.vob, (*) = not default, 0 = not detected
import frame size: -g 720x480 [720x576] (*)
aspect ratio: 4:3 (*)
frame rate: -f 29.970 [25.000] frc=4 (*)
PTS=2199.3972, frame_time=33ms bitrate=7000 kbps
audio track: -a 0 [0] -e 48000,16,5 [48000,16,2] -n 0x2000 [0x2000] (*)
PTS=2199.2763, bitrate=192 kbps
-D 3 --av_fine_ms 20 (frames & ms) [0] [0]
Odpowiedzi:
To jest okropne, głupie i powolne, ale wydaje się działać:
Działa również bezpośrednio na obcięte pliki i surowe strumienie (dlatego nic nie dostajesz dla plików .vob)
źródło
| tr ^M '\n'
i|tail -n 1
. Ponadto, żadne spacja poframes=
nie zawiedzie. (Może coś się zmieniło w ciągu ostatnich czterech lat.)ffprobe
można użyć do uzyskania informacji o pliku multimedialnym:Otrzymasz szczegółowe informacje o strumieniu:
Poszukaj za
nb_frames
pomocągrep
:Działa to dla avi, mp4 itp. W przypadku niektórych kontenerów nie wyświetla prawidłowej wartości, np. Mpeg.
W takim przypadku to działa
ffprobe -show_packets a.mpg 2>/dev/null | grep video | wc -l
źródło
Wysłałem to na inne pytanie . Za pomocą
tcprobe
narzędzia (ztranscode
pakietu) liczba ramek jest zawarta w informacji. Użyj-i
przełącznika, aby uzyskać zrzut informacji z pliku:Zauważ, że liczba ramek jest podana tutaj w dwóch liniach (2. linia wyjściowa i ostatnia linia wyjściowa).
źródło
Przekonałem się, że
mediainfo --fullscan inputfile | grep "Frame count"
działa ładnie dla większości plików.Systemy oparte na Debianie mogą go zainstalować
apt-get install mediainfo
Jeśli otrzymujesz 2 linie zamiast jednego wyjścia, pierwszy wiersz jest ścieżką wideo, a drugi wiersz jest ścieżką audio. Wygląda na to, że dzieje się tak w przypadku plików z dźwiękiem o zmiennej przepływności.
Testowane na próbkach .mkv, .m4v, .mp4, flv, vob i .avi na dzień edycji.
Źródła: Jak pobrać informacje o pliku wideo z wiersza poleceń w systemie Linux? i testowanie w wersjach Ubuntu.
Informacje o multimediach dostępne dla twojego systemu operacyjnego można znaleźć tutaj.
źródło
Dodaj czas trwania. Może być bardziej elegancki z sed / awk i co nie.
Z naszych testów mogę stwierdzić, że na razie okazało się, że jest najbardziej niezawodny. Otrzymasz dokładną liczbę klatek i dokładny czas trwania. Nawet przy zmiennej liczbie klatek na sekundę, którą wszystkie inne narzędzia, takie jak mediainfo, wydają się być gaga.
źródło
Przekonałem się, że liczba klatek jest w rzeczywistości dwa razy dłuższa niż fps * (nie mam pojęcia dlaczego, chętnie bym wiedział).
W moim skrypcie mam:
I tak, z jakiegoś powodu muszę uzyskać część całkowitą. To nie ma sensu, ale ten skrypt do tej pory zawsze poprawnie konwertował moje filmy.
źródło
tcprobe
wyjście w mojej odpowiedzi daje # klatek jak dokładnie sekund * fps (w zaokrągleniu). spodziewam się, że widzisz dziwactwo ffmpeg. próbowałeś przeanalizować plik za pomocą innych narzędzi, aby zobaczyć, czy pokazują one tę samą liczbę ramek?seconds*fps=1001.59
itcprobe=1002
. Więc oczywiścietcprobe
mówi mi, że nie muszę pomnożyć przez dwa. Dlaczego więc ffmpeg podaje mi liczbę dwukrotnie większą w dziennikach podczas konwersji?Testowane na Ubuntu.
melt
- melt miał być narzędziem testowym dla frameworka MLT, ale jest także potężnym edytorem wideo z wieloma wierszami poleceń. Może być również używany jako minimalistyczny odtwarzacz multimediów dla plików audio i wideo.-consumer
id [: arg] [name = wartość] *Ustaw konsumenta (sink)
xml
- Ustaw konsumenta (zlew) na formatowanie xml<property name="length">nnnn</property>
- pokazuje liczbę ramek, gdziennnn
jest zastąpiona liczbą całkowitą równą liczbie ramekJeśli nie masz stopu, możesz zainstalować go na Ubuntu i innych systemach opartych na Debianie
sudo apt-get install melt
źródło
mediainfo -fullscan filename
.Bezpośrednio z
mediainfo
, bez grep, bez czekania, bez niczego:Inne informacje patrz
mediainfo --info-parameters
źródło
Możesz to zrobić, dodając i mnożąc wartości otrzymane z ffprobe.
Uwaga: ffprobe jest częścią libav (avconv) - linuksowej wersji ffmpeg.
Gdy to zrobisz, otrzymasz liczbę klatek na sekundę, a także czas trwania klipu.
Konwertuj czas trwania klipu na sekundy i pomnóż tę wartość przez liczbę klatek / sekundę.
Pamiętaj, aby zaokrąglić liczbę do najbliższego.
źródło
ffprobe
nie jest dostępny, ale jest coś, co nazywaavprobe
sięlibav-tools
(co zapewnia równieżavconv
). Ale z mojej strony nie drukuje żadnej liczby ramek, przynajmniej nie dla formatów, które wypróbowałem. Po prostu drukuje, jakieavprobe -i
drukuje, i to jest tylko kilka drobnych bitów na temat formatu, niestety. Mimo-v debug
to mówi mi tylko kilka fajnych właściwości zainstalowanego sprzętu i oprogramowania, ale nie ma ani jednej interesującej informacji o pliku / strumieniu do sondowania. Być może ukrywa się w wielu dostępnych opcjach. Kto wie?ffmpeg
w oficjalnych repozytoriach. Link, który podałeś poprawnie, stwierdza: FFmpeg powrócił w Ubuntu 15.04 „Vivid Vervet”. . Sytuacja zmieniła się jednak po wydaniu 16.04 LTS.linux
rubin
źródło
Najlepsza metoda: (bezpośrednio przez obliczenie odpowiednich parametrów, potwierdzone przez ffmpeg)
Cmd ->
Wynik ->
Obliczanie ->
Dowód ->
Tutaj
Wydajność
źródło