Как вытащить кадры из видеофайла?
От: TheBug  
Дата: 23.03.05 15:39
Оценка:
Здравствуйте.
Пусть есть видеофайл произвольного формата, но в системе установлен кодек для него. Как получить доступ к видео по кадрам, причем кадр нужно получить в формате bitmap?
Re: Как вытащить кадры из видеофайла?
От: Аноним  
Дата: 24.03.05 03:49
Оценка:
Здравствуйте, TheBug, Вы писали:

TB>Здравствуйте.

TB>Пусть есть видеофайл произвольного формата, но в системе установлен кодек для него. Как получить доступ к видео по кадрам, причем кадр нужно получить в формате bitmap?

Попробуй IMediaDet
Re: Как вытащить кадры из видеофайла?
От: Alexey Polyakov Россия www.elecard.com
Дата: 24.03.05 05:00
Оценка:
Здравствуйте, TheBug, Вы писали:

TB>Пусть есть видеофайл произвольного формата, но в системе установлен кодек для него. Как получить доступ к видео по кадрам, причем кадр нужно получить в формате bitmap?


Привет. Есть несколько способов. Например, можно запросить картинку прямо у Video Mixing Renderer filter (VMR), если ты работаешь под Windows XP. Подробно описано в документации к Microsoft DirectX 9.0, статья "Mixing an Image Onto the Video Window in C++"

Фрагмент примера:


CComPtr<IMSVidCtl> m_pVideoControl;  // Video Control
CComPtr<IMSVidVideoRenderer> pVideo; // video renderer device
CComPtr<IPictureDisp> pPic;          // picture object
CComPtr<IMSVidRect> pRect;           // Automation-compatible rectangle
RECT rcWin;

/* Build and run the filter graph (not shown). */

// Capture the image.
hr = m_pVideoControl->get_VideoRendererActive(&pVideo);
hr = pVideo->Capture(&pPic);


Далее надо будет вытащить картинку из IPictureDisp, вполне возможно, что удасться даже сохранить ее в файл как BMP методом IPicture::SaveAsFile... Правда я сам не пробовал — читай MSDN.

Кроме того некоторые хорошие декодеры сами умеют отдать картинку в RGB24 формате. Схема работы при этом такая: получаешь интерфейс декодера, запрашиваешь требуемый размер буффера под картинку, выделяешь у себя буфер, запрашиваешь у декодера картинку. Последняя декодированная картинка упадет в выделенный буфер, причем уже вместе с заполненной структтурой BITMAPINFOHEADER. Подробности можно поискать на www.elecard.com

Удачи,
Алексей.
Re[2]: Как вытащить кадры из видеофайла?
От: TheBug  
Дата: 24.03.05 05:07
Оценка:
Здравствуйте, Аноним, Вы писали:
А>Попробуй IMediaDet

А можно поподробнее?
Re[2]: Как вытащить кадры из видеофайла?
От: TheBug  
Дата: 24.03.05 05:09
Оценка:
Здравствуйте, Alexey Polyakov, Вы писали:

AP>Привет. Есть несколько способов. Например, можно запросить картинку прямо у Video Mixing Renderer filter (VMR), если ты работаешь под Windows XP. Подробно описано в документации к Microsoft DirectX 9.0, статья "Mixing an Image Onto the Video Window in C++"


AP>Фрагмент примера:



AP>
AP>CComPtr<IMSVidCtl> m_pVideoControl;  // Video Control
AP>CComPtr<IMSVidVideoRenderer> pVideo; // video renderer device
AP>CComPtr<IPictureDisp> pPic;          // picture object
AP>CComPtr<IMSVidRect> pRect;           // Automation-compatible rectangle
AP>RECT rcWin;

AP>/* Build and run the filter graph (not shown). */

AP>// Capture the image.
AP>hr = m_pVideoControl->get_VideoRendererActive(&pVideo);
AP>hr = pVideo->Capture(&pPic);
AP>


AP>Далее надо будет вытащить картинку из IPictureDisp, вполне возможно, что удасться даже сохранить ее в файл как BMP методом IPicture::SaveAsFile... Правда я сам не пробовал — читай MSDN.


AP>Кроме того некоторые хорошие декодеры сами умеют отдать картинку в RGB24 формате. Схема работы при этом такая: получаешь интерфейс декодера, запрашиваешь требуемый размер буффера под картинку, выделяешь у себя буфер, запрашиваешь у декодера картинку. Последняя декодированная картинка упадет в выделенный буфер, причем уже вместе с заполненной структтурой BITMAPINFOHEADER. Подробности можно поискать на www.elecard.com


AP>Удачи,

AP>Алексей.

Попробую так. Но надо не только под XP.
Re[3]: Как вытащить кадры из видеофайла?
От: prozorov  
Дата: 24.03.05 08:20
Оценка:
Выдержка из DirectX SDK

To obtain information about a file using this interface, perform the following steps:

Create an instance of the MediaDet object by calling CoCreateInstance. The class ID is CLSID_MediaDet.
Call IMediaDet::put_Filename to specify the name of the source file.
Call IMediaDet::get_OutputStreams to obtain the number of output streams in the source.
Call IMediaDet::put_CurrentStream to specify a particular stream.
Call any of the following methods:
IMediaDet::get_FrameRate
IMediaDet::get_StreamLength
IMediaDet::get_StreamMediaType
IMediaDet::get_StreamType
To retrieve a video frame, call IMediaDet::GetBitmapBits or IMediaDet::WriteBitmapBits. The returned frame is always in 24-bit RGB format.


Я сам пробовал с avi различные кодеки, MPEG1 — работает
Про остальные не знаю
Re[4]: Как вытащить кадры из видеофайла?
От: TheBug  
Дата: 28.03.05 13:58
Оценка:
Здравствуйте, prozorov, Вы писали:


P>Выдержка из DirectX SDK


P>To obtain information about a file using this interface, perform the following steps:


P>Create an instance of the MediaDet object by calling CoCreateInstance. The class ID is CLSID_MediaDet.

P>Call IMediaDet::put_Filename to specify the name of the source file.
P>Call IMediaDet::get_OutputStreams to obtain the number of output streams in the source.
P>Call IMediaDet::put_CurrentStream to specify a particular stream.
P>Call any of the following methods:
P>IMediaDet::get_FrameRate
P>IMediaDet::get_StreamLength
P>IMediaDet::get_StreamMediaType
P>IMediaDet::get_StreamType
P>To retrieve a video frame, call IMediaDet::GetBitmapBits or IMediaDet::WriteBitmapBits. The returned frame is always in 24-bit RGB format.


P>Я сам пробовал с avi различные кодеки, MPEG1 — работает

P>Про остальные не знаю

Хотелось бы увидеть рабочий пример.
Re[2]: Как вытащить кадры из видеофайла?
От: Romul Россия  
Дата: 05.04.05 08:48
Оценка:
К сожалению не работает с интерлейснутым видео, да и вообще пробовали его использовать на половине файлов просто отказался работать
сообщил/сообщила в новостях следующее: news:1088077@news.rsdn.ru...
From: аноним

Здравствуйте, TheBug, Вы писали:

TB>Здравствуйте.

TB>Пусть есть видеофайл произвольного формата, но в системе установлен кодек для него. Как получить доступ к видео по кадрам, причем кадр нужно получить в формате bitmap?

Попробуй IMediaDet
Re: Как вытащить кадры из видеофайла? Оценить
Posted via RSDN NNTP Server 1.9
Re[2]: Как вытащить кадры из видеофайла?
От: Romul Россия  
Дата: 05.04.05 08:52
Оценка:
метод с декодерами ИМХО не будет работать в большинстве случаев.

На мой взгляд лучше всего вставлять в граф какой нибудь tee фильтр и написать свой простенький фильтр на подобее nullrenderer, который бы конектился только на RGB24. Правда может быть проблема, что не все декодеры выдают RGB24, но я таких не встречал

"Alexey Polyakov" <39622@users.rsdn.ru> сообщил/сообщила в новостях следующее: news:1088110@news.rsdn.ru...
From: Alexey Polyakov www.elecard.com

Здравствуйте, TheBug, Вы писали:

TB>Пусть есть видеофайл произвольного формата, но в системе установлен кодек для него. Как получить доступ к видео по кадрам, причем кадр нужно получить в формате bitmap?


Привет. Есть несколько способов. Например, можно запросить картинку прямо у Video Mixing Renderer filter (VMR), если ты работаешь под Windows XP. Подробно описано в документации к Microsoft DirectX 9.0, статья "Mixing an Image Onto the Video Window in C++"

Фрагмент примера:


CComPtr<IMSVidCtl> m_pVideoControl; // Video Control
CComPtr<IMSVidVideoRenderer> pVideo; // video renderer device
CComPtr<IPictureDisp> pPic; // picture object
CComPtr<IMSVidRect> pRect; // Automation-compatible rectangle
RECT rcWin;

/* Build and run the filter graph (not shown). */

// Capture the image.
hr = m_pVideoControl->get_VideoRendererActive(&pVideo);
hr = pVideo->Capture(&pPic);


Далее надо будет вытащить картинку из IPictureDisp, вполне возможно, что удасться даже сохранить ее в файл как BMP методом IPicture::SaveAsFile... Правда я сам не пробовал — читай MSDN.

Кроме того некоторые хорошие декодеры сами умеют отдать картинку в RGB24 формате. Схема работы при этом такая: получаешь интерфейс декодера, запрашиваешь требуемый размер буффера под картинку, выделяешь у себя буфер, запрашиваешь у декодера картинку. Последняя декодированная картинка упадет в выделенный буфер, причем уже вместе с заполненной структтурой BITMAPINFOHEADER. Подробности можно поискать на www.elecard.com

Удачи,
Алексей.
Re: Как вытащить кадры из видеофайла? Оценить
Posted via RSDN NNTP Server 1.9
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.