2015-02-12 57 views
5

Используя обертку AForge ffmpeg, вы можете извлекать кадры из видео с помощью класса VideoFileReader и сохранять его как растровое изображение.C# извлекать кадры из части видеофайла

Смотрите это для Exemple: Extracting frames of a .avi file

Моя проблема в том, что вы не можете указано, где начать читать кадры. Он всегда начинается с начала видеофайла.

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

Кто-нибудь знает способ достичь этого?

+0

Кажется, они не обеспечили способ для этого. Вы можете попробовать обмануть, разрезав файл, используя другую библиотеку, или просто используйте другую библиотеку для извлечения кадров для начала. EDIT: вы можете полностью отлаживать и видеть частных членов экземпляра «VideoFileReader» и посмотреть, может ли Reflection помочь вам здесь. – SimpleVar

+0

Похоже, хороший ответ мне, это вам не подходит? –

ответ

4

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

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

VideoFileReader reader = new VideoFileReader(); 
reader.Open("file.avi"); 

// Jump to 1 hour into the video 
int framesToSkip = reader.FrameRate * 3600; // 1 hour = 3600 seconds 
for (int i = 0; i < framesToSkip; i++) 
    reader.ReadVideoFrame(); 

// Now the next time ReadVideoFrame() is called, we will get the frame at the 1 hour mark 

Это предполагает, что .FrameRate свойства возвращает значение в кадрах в секунду. К сожалению, documentation не говорит, поэтому я не уверен, как он обрабатывает видеофайлы с неинтегральными кадрами (т. Е. 29.97 - общая частота кадров).

+0

Это, к сожалению, в настоящее время является единственным способом с оберткой AForge/Accord. Я бы добавил, если вы используете этот метод для удаления каждого фрейма, который вы выбрасываете, '' videoFrame.Dispose() '' (в цикле пропуска), иначе вы получите ошибки после 1k кадров. –

Смежные вопросы