ffmpeg FPS информация не соответствует видео

У меня есть куча видео со статистикой того, что происходит внутри видео. Одна такая информация дается в единицах времени видео в секундах с точностью до одного десятичного знака.

Чтобы получить FPS видео, я использую ffmpeg -i

Но когда я вручную вычисляю время одного конкретного кадра с заданным FPS, оно не совпадает.

Например, ffmpeg выдает FPS = 30.

Я смотрю статистику видео, кадр 156,8 = 2,368 должен быть 4704'th кадром. Я открываю видео с помощью "skvideo", читаю все кадры и просматриваю 4704'th кадр. Это какой-то кадр примерно в 2.12 ?. Я проверил несколько таких случаев в нескольких видео, и это обычное поведение.

Я не понимаю, почему это так и как решить проблему?

Таким образом, я не ограничен ffmpeg. Сквидео используется для чтения видео. Я пробовал opencv, на данный момент он не работает с VideoCapture, и его переустановка требует больших затрат времени. Но я думаю, что opencv / skvideo не имеет значения, кадры можно подсчитывать и вручную.

Итак, в решении я ищу -

  1. Учитывая временные метки внутри видео, как я могу найти кадр с этим конкретным временным местоположением?

  2. Если кто-то уже работал над этим, это связано с набором данных THUMOS. Я использую Ubuntu 16.04

РЕДАКТИРОВАТЬ_1

На самом деле я могу быть более конкретным, поскольку это общедоступные данные. Границы времени - важная деятельность. Например, в видео, когда происходит баскетбольный данк? Дается парами - [начало конец]. В некоторых видео есть несколько действий, в некоторых - только одно.

Вот пример видео, а ниже - время активности.

[[  16.5, 20.8],
[  26.6, 32.2],
[  34.8, 42.1],
[  47.8, 50.0],
[  58.1, 62.9],
[  65.6, 67.2],
[  68.5, 74.0],
[  76.4, 78.3],
[  78.7, 79.8],
[  80.8, 82.1],
[  85.0, 87.3],
[  90.1, 91.4],
[  98.5, 100.3]]

Я также попробовал проверить вручную, 32,87 FPS «почти» работает для некоторых видео, но не для всех. и почти означает, что он выключен на ~ 10 кадров. Это огромная разница для моей задачи, и мне нужен точный кадр.

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


person Adorn    schedule 04.12.2017    source источник
comment
Большинство видеокодеков полагаются на неполные (разностные изображения и т. Д.) Изображения, которые рассчитываются по времени воспроизведения. В зависимости от того, как интерпретируется ваш отснятый материал, его можно интерполировать. Итак, вы хотите убедиться, что во всех областях вы интерпретируете отснятый материал как есть. У вас есть пример видеофайла, в котором вы видите эту проблему?   -  person user1767754    schedule 04.12.2017
comment
@ user1767754, добавлен пример видео и дополнительная информация   -  person Adorn    schedule 04.12.2017
comment
видеоплееры воспроизводят видео с правильной частотой кадров? Возможно, запись или редактирование видео были ошибочными.   -  person Micka    schedule 04.12.2017


Ответы (2)


Если ваша цель - извлечь кадр, соответствующий метке времени, используйте

ffmpeg -i in.mp4 -vf select='lt(t,TS)*lt(TS-t,1/FPS)' -vsync 0 frame.png

TS следует заменить на вашу временную метку, а FPS - на частоту кадров, например. 'lt(t,78.7)*lt(78.7-t,1/30)'

Индексы кадров ненадежны, если частота кадров видео переменная, как у вас.

person Gyan    schedule 04.12.2017

Простой способ получить кадр с заданной меткой времени с помощью ffmpeg с точностью до кадра - это использовать параметр ffmpeg seek -ss. Если это то, что вы ищете, вы можете найти описание здесь - https://trac.ffmpeg.org/wiki/Seeking

person Jay    schedule 08.12.2017