Jak wyodrębnić znaczniki czasu powiązane z ramkami wyodrębnia ffmpeg z wideo z opcją -r?

12
ffmpeg -i myvid.mp4  -r  25  -t  100  image-%d.jpeg 

To polecenie, którego używam do wyodrębnienia ramek i działa tak, jak się spodziewałem. Chciałbym jednak również spojrzeć na znaczniki czasu ramek. Z dowolną precyzją. 100 milisekund jest dla mnie wystarczająco dobre. Czy ffmpeg może to zrobić?

Podając dodatkowe szczegóły,

Kiedy uruchamiam powyższe polecenie, otrzymuję około 100 plików JPEG, myślę, że istnieje zgodność od 1 do 1 (lub wiele do 1) między tymi plikami JPEG i ramkami wideo. Chciałbym poznać sygnaturę czasową ramki, która została wydrukowana jako obraz JPEG „i”.

Dodatkowo próbowałem ffprobe, ale okazuje się, że raportuje nawet czas trwania filmu niedokładnie :(

Srini
źródło
Jak co? JPEG AFAIK nie ma takich metadanych. Znacznik czasu EXIF ​​jest oznaczeniem captureczasu.
Rajib
Upewnij się, że JPEG nie ma metadanych, ale MP4 może. Czy mogę polecić ffmpeg, aby wyciągnął go wraz z ramkami, które później koduje jako JPEGS i zrzucił znaczniki czasu w pliku?
Srini,
Podaj pełne ffmpegdane wyjściowe konsoli z twojego polecenia.
llogan
ffprobe może dostarczyć informacji o znaczniku czasu ze strumienia wideo MP4. Czy pytasz, czy ramki mogą być powielane lub usuwane, jaka jest zgodność z oryginalnymi znacznikami czasu MP4? W takim przypadku zbadałbym zwiększenie ustawień gadatliwości, aby sprawdzić, czy można uzyskać klatka po klatce podczas wykonywania. Czy możesz rozwinąć to, co rozumiesz przez „znaczniki czasu powiązane z ramkami”.
dstob
@dstob Znaczniki czasowe powiązane z ramkami są znacznikami czasowymi prezentacji wejściowego wideo, tj. kiedy każda klatka powinna być pokazana, względem początku wideo.
slhck

Odpowiedzi:

13

Możesz „zasymulować” proces zapisu obrazu, filtrując go za pomocą fpsfiltra, a następnie używając, ffprobeaby wyświetlić znaczniki czasu generowanych ramek. Oznacza to, że przy 25 klatkach na sekundę 50. klatka (podobnie jak twój 50. obraz) będzie miała PTS wynoszący 2,00 sekundy.

Robisz to w ten sposób:

ffprobe -f lavfi -i "movie=input.mp4,fps=fps=25[out0]" -show_frames -show_entries frame=pkt_pts_time -of csv=p=0

Wyjdzie:

0
0.04
0.08
0.12
0.16
...

Są to znaczniki czasu dla każdego obrazu wyjściowego. Możesz połączyć listę ramek i znaczniki czasu:

obraz ls -1 - *. jpeg> images.txt
ffprobe -f lavfi -i "movie = input.mp4, fps = fps = 25 [out0]" -show_frames -show_entries frame = pkt_pts_time -of csv = p = 0> frames.txt
wklej images.txt frames.txt> Combined.txt

Utworzy plik z:

image-0001.jpeg 0
image-0002.jpeg 0.04
image-0003.jpeg 0.08
image-0004.jpeg 0.12

Zauważ, że może to powodować powstawanie obcych linii, jeśli jest zbyt wiele ramek lub zbyt wiele wierszy informacji wyjściowej. Wydaje się tam trochę niedokładne.

slhck
źródło
Czy jest to znacznik czasu w stosunku do stałej liczby klatek na sekundę umieszczonej na wyjściu, czy też zgodność wyjściowych plików JPEG z oryginalnymi znacznikami czasu MP4, które mogą być dowolnymi klatkami na sekundę i mieć dowolne wartości znaczników czasu?
dstob
Ten znacznik czasu jest oparty na żądanej wyjściowej szybkości klatek. Dotyczy to zarówno obrazów wyjściowych, jak i oryginalnych wejściowych ramek wideo, z których pochodzą te obrazy - istnieje tylko jedna podstawa czasowa. Działa to, ponieważ przy zmianie liczby klatek na sekundę ffmpeg nie będzie (oczywiście) odtwarzać wideo szybciej, ale „wydłuży” czas prezentacji każdej klatki i upuści niepotrzebne klatki.
slhck
Dlaczego musi istnieć tylko jedna podstawa czasu, gdy ręcznie tworzysz wyjściową podstawę czasu? Oczywiście nie zawsze tak będzie, ale na pierwszym filmie, na który rzuciłem 60 klatek na sekundę, ffmpeg właśnie stworzył własną bazę czasu, ignorując znaczniki czasu na wejściu.
dstob
Nie jestem pewien, czy rozumiem, do czego dokładnie zmierzasz. ffmpeg wybiera jako podstawę czasu wejściowego wszystko, co analizuje jako podstawę czasu pierwszego pliku wejściowego . Oczywiście możesz też powiedzieć ffmpeg, aby wyrzucił znaczniki czasu wejścia -vsync drop, ale dzieje się tak po filtrowaniu IIRC.
slhck