Как извлечь временные метки, связанные с кадрами, которые 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, но я считаю, что он сообщает даже продолжительность видео неточно :(


Как, что? 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

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


Является ли это меткой времени по отношению к постоянной частоте кадров, размещенной на выходе, или соответствием выводимых jpegs исходным меткам времени mp4, которые могут иметь любую частоту кадров и иметь какие-либо значения меток времени?
— Дстоб

Эта временная метка основана на запрошенной выходной частоте кадров. Это относится как к выходным изображениям, так и к исходным входным видеокадрам, из которых получены эти изображения - существует только одна временная база. Это работает, потому что при изменении частоты кадров ffmpeg (конечно) не будет воспроизводить видео быстрее, но «растянет» время представления каждого кадра и удалит ненужные кадры.
— Slhck

Почему при создании вручную выходной базы времени должна быть только одна временная база? Конечно, это не всегда так, но на первых 60 кадрах в секунду, которые я добавил, ffmpeg просто создал собственную базу времени, игнорируя отметки времени ввода.
— Дстоб

Не уверен, что понимаю, к чему вы клоните. ffmpeg выбирает в качестве входной временной базы все, что анализирует в качестве временной базы первого входного файла . Конечно, вы также можете указать ffmpeg отбрасывать входные временные метки -vsync drop, но это происходит после фильтрации, IIRC.
— Slhck
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.