Хвост последний кадр растущего видеофайла - PullRequest
3 голосов
/ 02 ноября 2011

В Windows у меня есть динамически созданный несжатый видео файл AVI, который со временем увеличивается.Приложение, которое генерирует видеофайл, может записывать только в физический файл.Я могу запустить / остановить генерацию видеофайла и легко удалить старый видеофайл.

Я хотел бы проанализировать изменяющийся последний кадр растущего видеофайла, чтобы принять решение в зависимости от содержимого текущего / последнего изображения в режиме реального времени.Если я могу достичь более 10 кадров в секунду, этого должно быть достаточно.Я хотел бы получать несжатые изображения всякий раз, когда в видеофайле появляется новый кадр.

Как формат файла, я думаю, что png может быть лучшим вариантом в этом случае, но я открыт для альтернатив.Интересно, возможно ли такое с ffmpeg или с подобным инструментом?

Я предпочитаю анализировать изображение и принимать решения, используя модуль perl + Imager.Требования к анализу не сложны.По сути, мне просто нужно найти несколько небольших изображений в определенных местах внутри последнего кадра.Я также был бы признателен, если бы вы могли предложить эффективный способ передачи этой информации в мое приложение из ffmpeg.Например, передача по трубопроводу непосредственно в мой код или чтение из сохраненных png-файлов.

Я знаю, что в perl уже есть интерфейсный модуль ffmpeg, но, насколько я понимаю, этот модуль не может обеспечить необходимую мне функциональность.

1 Ответ

1 голос
/ 10 января 2012

Прежде всего, я надеюсь, что вы понимаете скорость передачи несжатого видео!Например, при разрешении 720x480 (обычный NTSC, а не HD) с 16-битным цветом при скорости 10 кадров в секунду вы генерируете 6,6 мегабайта в секунду.Вы заполняете жесткий диск объемом 1 ТБ менее чем за два дня.Обработка этой скорости передачи данных в perl должна быть интересной.

Получение новых кадров из файла должно быть довольно простым, поскольку это несжатое видео.

  1. Предположим, вы начинаете с началаAVI (например, вы начинаете захват вместе с обработкой).
  2. Прочитайте заголовок AVI, убедившись, что он соответствует ожидаемому (например, в правильном формате).
  3. Обратите внимание на текущую метку времени в секунду.(например, из Time :: HiRes).
  4. Вы знаете длину одного кадра.Попытка sysread этого.Продолжайте попытки, пока либо вы не получите полный кадр (конечно, каждый раз обновляя запрошенную длину), либо пока не получите EOF (sysread возвращает 0).
  5. Если вы получили EOF до полного кадра: sleepНебольшое время (скажем, 10 мс, Time::HiRes позволит вам поспать менее 1 секунды), а затем снова попробуйте прочитать оставшуюся часть кадра.sysread не требует сброса индикации EOF;он будет пытаться снова каждый раз, когда вы звоните.Продолжайте цикл задержки / sysread, пока у вас не будет полного кадра.
  6. Теперь у вас есть полный кадр.Так как это несжатое видео, ему действительно не нужно много расшифровки, прежде чем передать его в код вашего компьютерного зрения.(Вам, возможно, придется поменять местами байты или преобразовать их из 16 в 32 бита, но ничего хуже).
  7. Поскольку вы читаете видео со скоростью 10 кадров в секунду, спите в течение оставшейся части 1/10 секунды, прежде чемследующий кадр.
  8. Вернитесь к (3).

Вы можете обнаружить, что если вы используете библиотеку для реализации своего компьютерного зрения, у нее есть функции, помогающие с этим - например,, он может быть в состоянии прочитать кадры из файла AVI.OpenCV, например, может.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...