Извлечение фреймов файла .avi

Я пытаюсь написать код С#, чтобы извлечь каждый кадр файла .avi и сохранить его в предоставленном каталоге. Знаете ли вы какую-либо подходящую библиотеку для использования в этих целях?

Примечание. Окончательная версия должна работать на всех системах независимо от установленного кодека или системной архитектуры. Он не должен требовать наличия на компьютере другой программы (например, MATLAB).

Спасибо заранее. Тунк

Ответ 1

Это невозможно, если вы не добавите каких-либо ограничений на ваши входные AVI файлы или не сможете управлять кодер, используемым для их создания. Чтобы получить изображение, вам придется сначала его декодировать, и для этого вам понадобится соответствующий кодек, установленный или развернутый с вашим приложением. И я сомневаюсь, что его можно учесть для каждого кодека или установить/развернуть их все. Нет, вы не сможете открыть какой-либо файл avi. Тем не менее, вы можете поддерживать самые популярные (или распространенные в вашем контексте) кодеки.

Самый простой способ сделать это - действительно использовать FFMPEG, так как его alredy включает в себя некоторые из наиболее распространенных кодеков (если вы не возражаете против добавления 30 + МБ к вашему приложению). Что касается оберток, я использовал AForge обертку в прошлом и очень понравился, из-за того, насколько просто работать. Вот пример из его документов:

// create instance of video reader
 VideoFileReader reader = new VideoFileReader( );
// open video file
reader.Open( "test.avi" );
// read 100 video frames out of it
for ( int i = 0; i < 100; i++ )
{
    Bitmap videoFrame = reader.ReadVideoFrame( );

    videoFrame.Save(i + ".bmp")

    // dispose the frame when it is no longer required
    videoFrame.Dispose( );
}
reader.Close( );

В AForge также есть оболочка VfW (которая включена в Windows по умолчанию), если вы хотите сохранить ее простой без привлечения внешних библиотек. Вам все равно понадобятся совместимые с VfW кодеки (некоторые из них включены в Windows по умолчанию, большинство из них не являются).