Як витягнути часові позначки, пов'язані з фрагментами кадрів ffmpeg з відео з опцією -r?


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

Це команда, яку я використовую для вилучення кадрів, і вона працює так, як я очікував. Однак я також хотів би поглянути на часові позначки кадрів. З будь-якою точністю. 100 мілісекунд мені досить добре. Чи може це зробити ffmpeg?

Надаючи додаткові деталі,

Коли я запускаю вищезгадану команду, я отримую близько 100 JPEG, я здогадуюсь, що між цими JPEGS і кадрами відео є відповідність від 1 до 1 (або багато до 1). Мені хотілося б знати часову позначку кадру, який виводився у вигляді JPEG JPI 'i'.

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


Як що? AFAIK jpeg не має таких метаданих. Часова позначка EXIF ​​- captureчас.
Раджиб

Звичайно, JPEG не має метаданих, але mp4 може. Чи можу я направити ffmpeg на те, щоб витягнути його разом з кадрами, які він згодом кодує як JPEGS і скинути часові позначки у файл?
Шріні

Будь ласка, включіть повний ffmpegвихід консолі з вашої команди.
llogan

ffprobe може надати вам інформацію про часові позначки з відеопотоку mp4. Ви запитуєте, ніби кадри можуть бути дублюватись чи відпускати, що таке відповідність вихідним часовим позначкам mp4? У такому випадку я б досліджував підвищення параметрів багатослівності, щоб побачити, чи можна отримати кадр за кадром під час виконання. Чи можете ви розширити, що ви маєте на увазі під "часовими позначками, пов'язаними з кадрами".
dstob

@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 зображення - *. 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> frame.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, які можуть бути будь-якими частотами кадрів і мати будь-які значення часових позначок?
dstob

Ця часова мітка заснована на запитуваному кадрі виводу. Це стосується як вихідних зображень, так і оригінальних вхідних кадрів для відео, з яких вони потрапили - є лише одна часова база. Це працює, тому що, змінюючи частоту кадрів, ffmpeg (звичайно) не відтворюватиме відео швидше, але "розтягуватиме" час презентації кожного кадру та скидає непотрібні кадри.
slhck

Чому при ручному створенні бази часу виводу має бути лише одна часова база? Звичайно, це не завжди так, але на першому відео в 60 кадрів в секунду, який я накинув на нього, ffmpeg просто створив власну базу часу, ігноруючи часові позначки введення.
dstob

Не впевнений, що я розумію, до чого саме ти потрапляєш. ffmpeg вибирає в якості часової бази входу все, що вона аналізує, як часову базу першого вхідного файлу . Ви, звичайно, також можете сказати ffmpeg, щоб викинути вхідні часові позначки -vsync drop, але це відбувається після фільтрації, IIRC.
slhck
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.