Как извлечь временные метки, связанные с кадрами, которые ffmpeg извлекает из видео с параметром -r?

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

Является ли команда, которую я использую для извлечения кадров, и она работает так, как я ожидал. Однако я также хотел бы посмотреть на временные метки кадров. С любой точностью. 100 миллисекунд это достаточно хорошо для меня. Может ли ffmpeg сделать это?

Предоставление дополнительных деталей,

Когда я запускаю вышеупомянутую команду, я получаю около 100 JPEG, я предполагаю, что между этими JPEGS и кадрами видео есть соответствие 1 к 1 (или много к 1). Я хотел бы знать временную метку кадра, который был выведен как изображение JPEG 'i'.

Кроме того, я попытался ffprobe, но я считаю, что он сообщает даже продолжительность видео неточно :(

Srini
источник
Как, что? AFAIK jpeg не имеет таких метаданных. Отметка времени EXIF ​​для captureвремени.
Раджиб
Конечно, JPEG не имеет метаданных, но mp4 может. Могу ли я указать ffmpeg вытянуть его вместе с кадрами, которые он позже кодирует как JPEGS, и вывести метки времени в файл?
Срини
Пожалуйста, включите полный ffmpegвывод консоли из вашей команды.
Llogan
ffprobe может дать вам метку времени из видеопотока mp4. Вы спрашиваете, что если кадры могут быть дублированы или отброшены, то каково соответствие с оригинальными временными метками mp4? В этом случае я бы рассмотрел возможность увеличения параметров многословия, чтобы увидеть, можно ли получить кадр за кадром во время выполнения. Не могли бы вы рассказать о том, что вы подразумеваете под «временными метками, связанными с кадрами».
Дстоб
@dstob Временные метки, связанные с кадрами, представляют собой временные метки представления входного видео, т. е. когда должен быть показан каждый кадр относительно начала видео.
Slhck

Ответы:

13

То, что вы можете сделать, это «смоделировать» процесс записи изображения, отфильтровав его с помощью fpsфильтра, а затем использовать ffprobeдля отображения меток времени сгенерированных кадров. Это означает, что при 25 кадрах в секунду 50-й кадр (как и ваше 50-е изображение) будет иметь PTS 2,00 секунды.

Вы делаете это так:

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

Будет выводить:

0
0.04
0.08
0.12
0.16
...

Это временные метки для каждого выходного изображения. На самом деле вы можете объединить список кадров и отметок времени:

ls -1 image - *. 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
вставить images.txt frames.txt> комбинированный.txt

Создаст файл с:

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

Обратите внимание, что это может привести к лишним строкам, если слишком много кадров или слишком много строк вывода информации. Кажется, немного неточно.

slhck
источник
Является ли это меткой времени по отношению к постоянной частоте кадров, размещенной на выходе, или соответствием выводимых jpegs исходным меткам времени mp4, которые могут иметь любую частоту кадров и иметь какие-либо значения меток времени?
Дстоб
Эта временная метка основана на запрошенной выходной частоте кадров. Это относится как к выходным изображениям, так и к исходным входным видеокадрам, из которых получены эти изображения - существует только одна временная база. Это работает, потому что при изменении частоты кадров ffmpeg (конечно) не будет воспроизводить видео быстрее, но «растянет» время представления каждого кадра и удалит ненужные кадры.
Slhck
Почему при создании вручную выходной базы времени должна быть только одна временная база? Конечно, это не всегда так, но на первых 60 кадрах в секунду, которые я добавил, ffmpeg просто создал собственную базу времени, игнорируя отметки времени ввода.
Дстоб
Не уверен, что понимаю, к чему вы клоните. ffmpeg выбирает в качестве входной временной базы все, что анализирует в качестве временной базы первого входного файла . Конечно, вы также можете указать ffmpeg отбрасывать входные временные метки -vsync drop, но это происходит после фильтрации, IIRC.
Slhck