Доступ к видео кадр за кадром - PullRequest
3 голосов
/ 08 октября 2009

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

Ответы [ 9 ]

5 голосов
/ 22 октября 2009

Предоставьте мне доступ к кадрам видео в реальном времени и позвольте мне изменить их

Вы хотите получить несжатые видеокадры и изменить их до того, как они будут воспроизведены? Или вы хотите изменить видеокадры, сохранив их обратно в медиа-файл?

Первый будет немного проще. Хотя DirectShow может показаться сложным на первый взгляд, это действительно элегантный фреймворк. Я настоятельно рекомендую посмотреть образцы DirectShow.NET. Чтобы получить доступ к кадрам видео, вам нужно просто настроить и добавить фильтр SampleGrabber на график DirectShow, выполнить graph.RenderFile (mymediafile, null), и вы получите обратный вызов для каждого кадра. Вы можете изменить данные пикселя, и они появятся на отрендеренном видео. Это не должно занимать более 1 страницы кода. У меня есть пример исходного кода по использованию SampleGrabber , но он сделан для веб-камер. Воспроизведение мультимедиа намного проще (graph.RenderFile!).

Если вам нужно записать этот материал в файл, вы должны сделать что-то похожее на то, что описано выше, но вместо использования средства визуализации видео вам придется настроить график для использования видеокодеров и мультиплексоров. Наверное, не интересно для новичка в DirectShow;).

Если вы просто хотите получить фреймы, в DirectShow есть ОЧЕНЬ простой интерфейс IMediaDet. Я написал простой класс , чтобы легко извлечь любые кадры из медиа-файла. Он ориентирован на WPF, но вы можете использовать его для работы с прямым GDI.

4 голосов
/ 24 октября 2009

Я понятия не имею, чего именно вы пытаетесь достичь, так что это может вам не помочь, но если вам просто нужно изменить кадры видео на лету, я настоятельно рекомендую посмотреть AviSynth, Это сервер видеокадров, использующий язык сценариев для изменения видео. Для него также есть SDK, который вы можете использовать для написания бинарных плагинов. Есть много плагинов, уже доступных для выполнения различных задач. Пример сценария будет выглядеть так:

AviSource("C:\video.avi")
Crop(20,0,-20,0) //Crops 20px from the left and right of video 
BicubicResize(640,480) //Resize to 640x480 using bicubic filter
# increase the gamma
Levels(0, 1.2, 255, 0, 255)

Эти сценарии можно затем открыть в медиаплеере или кодировщике, например Virtualdub.

4 голосов
/ 18 октября 2009

Вы можете взглянуть на команду ffmpeg и проект с открытым исходным кодом, который использует библиотеку libavcodec.

3 голосов
/ 25 октября 2009

ОК, так как вы спросили "просто", я должен упомянуть HTML5 . Смотрите демоверсию и объяснение по этим ссылкам:

1 голос
/ 18 октября 2009

Hy Opencv - это то, что вам нужно. Это фреймворк, с помощью которого вы можете манипулировать изображениями, видео и многим другим. http://opencv.willowgarage.com/wiki/

0 голосов
/ 20 октября 2009

Вы можете использовать FFMpeg .

Проверьте документацию FFmpeg

0 голосов
/ 19 октября 2009

самое простое решение - использование AVIFile API . Есть много доступных образцов.

0 голосов
/ 19 октября 2009

Рассмотрите возможность создания плагина VLC

Работает в Linux и Windows, поддерживает видео в реальном времени, потоковую передачу из файла, множество кодеков и т. Д.

0 голосов
/ 09 октября 2009

Некоторое время назад в нескольких пакетах C ++ от MS был класс под названием AviFile. Я не уверен, что радует это.

Лучший способ решить эту проблему - использовать DirectShow, если вы придерживаетесь окон.

Формат файла AVI (который хорошо документирован и вы можете найти в Google) немного похож на:

AVIRIFF  size speed imgWidth imgHeight frameTotal imgCodec audioCodec frame size 
  FRAME
  SOUND
  FRAME 
  SOUND
...