Chcę komendy FFmpeg szukającej tak szybko i dokładnie. Znalazłem to .
Rozwiązaniem jest to, że ubiegamy się -ss
zarówno o dane wejściowe (szybkie wyszukiwanie), jak i wyniki (dokładne wyszukiwanie). Ale: Jeśli szukanie danych wejściowych nie jest dokładne, w jaki sposób możemy być pewni, że pozycja szukania jest dokładna?
Na przykład: jeśli chcemy szukać do 00:03:00, polecenie wygląda następująco:
ffmpeg -ss 00:02:30 -i <INPUT> ... -ss 00:00:30 <OUTPUT>
Pierwszy -ss
będzie szukał czegoś innego, a nie 00:02:30
powiedzą 00:02:31
. A po zastosowaniu drugiego poszukiwania końcowy wynik byłby 00:03:01
- nie taki, jaki chcemy. Czy to jest poprawne?
Gdzie -ss
szuka tego pierwszy ? Czy chodzi o najbliższą klatkę kluczową 00:02:30
?
Jeśli tak, oto moja myśl - popraw mnie, jeśli się mylę: po pierwszym wyszukiwaniu otrzymujemy znacznik czasu wyniku (w tym przykładzie 00:02:31
:), a następnie stosujemy drugie wyszukiwanie z odpowiednim czasem, w tym przypadku 00:00:29
.
Pytanie brzmi: Jak uzyskać znacznik czasu wyniku pierwszego wyszukiwania?
ffprobe
. Jeśli nie, zrobiłby to każdy format pośredni, np. ProRes 422, DNxHD, które są wizualnie bezstratne i tylko wewnątrz klatki. Albo używasz czegoś takiego jak HuffYUV itp. Ale wtedy oczywiście stracisz aspekt „szybki”.Unrecognized option 'select_streams'
select_streams
opcja została dodana w październiku 2012 r . :) Mogłoby się bez tego obejść, ale wtedy dostaniesz również informacje dla ramek audio, pomieszanych pomiędzy nimi.Rozumiem, że to pytanie ma kilka lat, ale najnowsza wersja programu ffprobe ma możliwość pomijania ramek . Możesz przekazać,
-skip_frame nokey
aby zgłosić informacje tylko o ramkach kluczowych (I-ramki). To pozwala zaoszczędzić dużo czasu! W przypadku pliku MP4 2 GB 1080p zajęło 4 minuty bez pomijania klatek. Dodanie parametru pominięcia zajmuje tylko 20 sekund.Komenda:
ffprobe -select_streams v -skip_frame nokey -show_frames -show_entries frame = pkt_pts_time, pict_type D: \ test.mp4
Wyniki:
Zatem wyniki będą zawierać tylko informacje dotyczące klatek kluczowych.
źródło
Opierając się na odpowiedzi slhck , oto funkcja bash, która zwróci najbliższą klatkę kluczową występującą PRZED
N
sekundami.Pozwala to również
-read_intervals
upewnić się, że ffprobe zacznie szukać twojej klatki kluczowej 25 sekund przedN
sekundami. Ta sztuczka i wyjście z awk po znalezieniu znacznika czasu znacznie przyspiesza.przykładowe użycie:
Używam tego do przycinania plików wideo bez ich ponownego kodowania. Ponieważ nie można dodawać nowych klatek kluczowych bez ponownego kodowania,
ffnearest
szukam w klatce kluczowej, zanim chcę ją wyciąć. Oto przykład:Zauważ, że w tym przykładzie może być konieczna zmiana formatu tego, co przekazano w
-ss
parametrze, jeśli szukasz więcej niż pierwszych 60 sekund.(irytujące, mówiąc ffmpeg, aby szukał dokładnie znacznika czasu klatki kluczowej, wydaje się, że ffmpeg wyklucza tę klatkę kluczową w danych wyjściowych, ale odejmowanie 0,5 sekundy od rzeczywistego znacznika czasu klatki kluczowej robi załamanie. W przypadku bash musisz użyć
bc
do oceny wyrażeń dziesiętnych , ale w Zsh-ss 00:00:$[$(ffnearest input.mkv 28)-0.5]
działa.)źródło
jeśli chcesz uzyskać informacje o ramkach I, możesz użyć
źródło