ffmpeg извлекает временные метки кадра из видео

Я использую эту библиотеку для использования FFmpeg с моим приложением Android. Я извлекаю кадры из видео, а затем добавляю их в средство просмотра кадрирования. Таким образом, каждый кадр должен представлять некоторый временной кадр в видео. Вот мой текущий код ffmpeg для извлечения кадров:

ffmpeg -i inputFile -f image2 -ss mySS -r myR frame-%05d.png

Как мне добавить метку времени к каждому кадру при использовании приведенной выше команды? Так что я знаю, например, что кадр 5 находится на 9-й секунде видео.

Я не знаю, есть ли в ffmpeg lib, который я использую, ffprobe из этого ссылка. Я также просмотрел другие ссылки на stackoverflow

приветствуется любая помощь


person TheOtherguyz4kj    schedule 25.11.2017    source источник
comment
Вам нужна информация в имени файла или на изображении?   -  person Gyan    schedule 26.11.2017
comment
Я не возражаю, если это быстро, и я могу поместить каждый таймфрейм в переменную. Спасибо!   -  person TheOtherguyz4kj    schedule 26.11.2017
comment
Кто-нибудь может помочь?   -  person TheOtherguyz4kj    schedule 27.11.2017


Ответы (2)


frame_pts - ваш друг ... установите для него значение true, и ffmpeg выведет временную метку представления кадра в качестве вашего имени файла.

ffmpeg -skip_frame nokey -i file -vsync 0 -frame_pts true out%d.png

Благодарности относятся к этому ответу суперпользователя .. дополнительное объяснение смешивания параметра -r частоты кадров с frame_pts

person hoohoo-b    schedule 12.07.2019

Чтобы записать метку времени в видео:

ffmpeg -i inputFile -vf drawtext=fontfile='/path/to/font':fontcolor=white:fontsize=25:x=(w-tw)/2:y=h-th-10:text='Source time: %{pts}' -ss mySS -r myR frame-%05d.png

Если у вас есть сборка FFmpeg> 13 ноября 2017, вы можете запустить

ffmpeg -i inputFile -f image2 -vf select='gte(t,mySS)' -vsync 0 -frame_pts 1 frame-%05d.png

Это будет пронумеровать выходные кадры с индексом исходного кадра.

Если вы не можете обновить FFmpeg, есть более длительный обходной путь.

Запустить

ffmpeg -i inputFile -f image2 -vf select='gte(t,mySS)',showinfo -vsync 0 frame-%05d.png 2> log.txt

Это перенаправит консоль в текстовый файл. В нем вы увидите такие строки:

...
     Metadata:
      encoder         : Lavc58.1.100 wrapped_avframe
[Parsed_showinfo_1 @ 00000000056d9dc0] n:   0 pts:  38400 pts_time:3       pos:   105928 fmt:yuv420p sar:1/1 s:320x240 i:P iskey:0 type:B checksum:F6027584 plane_checksum:[FAA4D7FC 4748A9ED 4767F37D] mean:[123 129 126] stdev:[57.1 78.2 80.6]
[Parsed_showinfo_1 @ 00000000056d9dc0] n:   1 pts:  38912 pts_time:3.04    pos:   101527 fmt:yuv420p sar:1/1 s:320x240 i:P iskey:0 type:P checksum:ECBC791A plane_checksum:[4104BBD1 4805B985 542303B5] mean:[123 129 126] stdev:[57.1 78.1 80.5]
[Parsed_showinfo_1 @ 00000000056d9dc0] n:   2 pts:  39424 pts_time:3.08    pos:   108798 fmt:yuv420p sar:1/1 s:320x240 i:P iskey:0 type:B checksum:70B2AC23 plane_checksum:[EF78A2F1 946CDA4F 39B72ED4] mean:[123 129 127] stdev:[57.1 77.8 80.1]
...

Вы можете анализировать и извлекать значения pts_time, которые имеют соответствие 1: 1 с созданными изображениями.

person Gyan    schedule 27.11.2017
comment
Я определенно не могу использовать вторую команду, потому что я думаю, что версия libs - v3.0.1. Также мне не нужны временные рамки на изображении, мне нужно назначить его переменной. Было бы удобно, если бы я мог называть каждое имя файла кадра временем кадра в видео или любым другим способом, я мог бы поместить их в переменные. большое спасибо - person TheOtherguyz4kj; 28.11.2017
comment
Не могли бы вы помочь мне с моим обновленным вопросом в комментариях? Благодарность :) - person TheOtherguyz4kj; 29.11.2017