Здравствуйте.
Пусть есть видеофайл произвольного формата, но в системе установлен кодек для него. Как получить доступ к видео по кадрам, причем кадр нужно получить в формате bitmap?
Re: Как вытащить кадры из видеофайла?
От:
Аноним
Дата:
24.03.05 03:49
Оценка:
Здравствуйте, TheBug, Вы писали:
TB>Здравствуйте. TB>Пусть есть видеофайл произвольного формата, но в системе установлен кодек для него. Как получить доступ к видео по кадрам, причем кадр нужно получить в формате bitmap?
Здравствуйте, 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
Здравствуйте, 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>Алексей.
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 — работает
Про остальные не знаю
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>Про остальные не знаю
К сожалению не работает с интерлейснутым видео, да и вообще пробовали его использовать на половине файлов просто отказался работать
сообщил/сообщила в новостях следующее: news:1088077@news.rsdn.ru...
From: аноним
Здравствуйте, TheBug, Вы писали:
TB>Здравствуйте. TB>Пусть есть видеофайл произвольного формата, но в системе установлен кодек для него. Как получить доступ к видео по кадрам, причем кадр нужно получить в формате bitmap?
Попробуй IMediaDet
Re: Как вытащить кадры из видеофайла? Оценить
метод с декодерами ИМХО не будет работать в большинстве случаев.
На мой взгляд лучше всего вставлять в граф какой нибудь tee фильтр и написать свой простенький фильтр на подобее nullrenderer, который бы конектился только на RGB24. Правда может быть проблема, что не все декодеры выдают RGB24, но я таких не встречал
Здравствуйте, 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: Как вытащить кадры из видеофайла? Оценить