Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Windows Media Encoder SDK - как получить фреймы из видеопотока

31K
26 сентября 2007 года
Timberwolve
7 / / 12.09.2007
Здравствуйте!
столкнулся с проблемой - использую Windows Media Encoder 9 SDK для кодирования видеопотока. Не знает ли кто, возможно ли вытащить из потока кадры? Существует куча методов для задания параметров буфера потока, например

 
Код:
IWMEncAudienceObj*  pAudience=NULL;
.......
pAudience->put_VideoBufferSize  //(задает размер буфера в миллисекундах)
pAudience->put_VideoFPS //(задает число кадров в секунду)

и пр. параметры.

Но вот как получить указатель на область памяти, содержащий кадр?
Может быть, кто-нибудь сталкивался?
5.9K
28 сентября 2007 года
Zushenskiy
161 / / 29.06.2006
прям специализированного интерфейса я даже и не слыхал но в Windows Media Encoder есть замечательная вешь как плагины котрые позволяют реализовать различного рода фичеры. есть один тип таких плагинов как трансформера которые позволяют влиять на видео и аудио потоки. Cоздаются они очень просто: создаешь Transform DirectShow фильтер и реализуешь в нем сохранение RAW фреймов на диск либо комутируешся со своим приложением и отдаешь ему.
31K
01 октября 2007 года
Timberwolve
7 / / 12.09.2007
Цитата: Zushenskiy
прям специализированного интерфейса я даже и не слыхал но в Windows Media Encoder есть замечательная вешь как плагины котрые позволяют реализовать различного рода фичеры. есть один тип таких плагинов как трансформера которые позволяют влиять на видео и аудио потоки. Cоздаются они очень просто: создаешь Transform DirectShow фильтер и реализуешь в нем сохранение RAW фреймов на диск либо комутируешся со своим приложением и отдаешь ему.



Спасибо за идею :) попробую )

31K
12 октября 2007 года
Timberwolve
7 / / 12.09.2007
А теперь возникла следующая проблема: использую в качестве трансформ плагина SampleGrabber. Но не могу подцепить директ шоу фильтр к интерфейсу.

 
Код:
hr = pSrcGrp->get_GroupTransformCollection(&pTransColl);
hr = pTransColl->Add(&pTransform);
//В качестве инпута передается схема плагина - не могу понять,
// что передавать в качестве имени схемы имея директ-шоу фильтр
hr = pTransform->SetInput( CComBSTR("Название_Схемы_Плагина"));

Что передавать в качестве Название_СХемы_Плагина чтобы использовать нужный Ком-объект?

Может быть, кто-то сталкивался?
5.9K
12 октября 2007 года
Zushenskiy
161 / / 29.06.2006
hr=pTransform->SetInput(CComBSTR("TCGroupTransformPlugin://SampleGrabber1"));
31K
15 октября 2007 года
Timberwolve
7 / / 12.09.2007
Не помогло :(
Вот привожу кусок кода, может быть, подскажите, где туплю...
если убрать три строчки, связанные с Transform plug-in - все работает,
в противном случае возникает ошибка при инициализации энкодера :(
Код:
WMEncSourceGroupCollection* pSrcGrpCollection=NULL;
IWMEncSourceGroup* pSrcGrp=NULL;
IWMEncSource* pSrc=NULL;
IPropertyBag* pPropertyBag=NULL;
IWMEncVideoSource2* pSrcVid=NULL;
IWMEncProfile*  pProfile=NULL;

IWMEncTransformCollection* pTransColl = NULL;
IWMEncTransform* pTransform = NULL;
IUnknown* pPlugin = NULL;

CoCreateInstance(CLSID_WMEncoder,NULL,CLSCTX_INPROC_SERVER,IID_IWMEncoder2,(void**)&g_pEncoder);

g_pEncoder->get_SourceGroupCollection(&pSrcGrpCollection);
hr=pSrcGrpCollection->Add(CComBSTR("SourceGroup1"),&pSrcGrp);
hr=pSrcGrp->AddSource(WMENC_VIDEO,&pSrc);

hr = pSrcGrp->get_GroupTransformCollection(&pTransColl);
hr = pTransColl->Add(&pTransform);

hr = pTransform->SetInput( CComBSTR("TCGroupTransformPlugin://SampleGrabber1"));

hr=pSrc->QueryInterface(IID_IWMEncVideoSource2,(void**)&pSrcVid);
hr=pSrcVid->SetInput(CComBSTR("ScreenCap://ScreenCapture1");

hr=pSrcVid->QueryInterface(IID_IPropertyBag,(void**)&pPropertyBag);
varValue = CAPTURE_FULLSCREEN;

hr=pPropertyBag->Write(WMSCRNCAP_ENTIRESCREEN,&varValue);
//В этой функции проставляю настройки видео: число кадров в секунду,
//качество и тд.

hr=SetupScreenCaptureProfile();
hr=g_pProfile->QueryInterface(IID_IWMEncProfile,(void**)&pProfile);
hr=pSrcGrp->put_Profile(variant_t(pProfile));

// И вот здесь вываливается ошибка...
hr=g_pEncoder->PrepareToEncode(VARIANT_TRUE);
31K
19 октября 2007 года
Timberwolve
7 / / 12.09.2007
Разобрался с подключением плагина :

 
Код:
hr = pSrc->get_TransformCollection(&pTransColl);
hr = pTransColl->Add(&pTransform);
hr = pTransform->SetInput( CComBSTR("TransformPluginWrapper://SampleGrabber"));

// После такого объявления инициализация проходит успешно
hr=g_pEncoder->PrepareToEncode(VARIANT_TRUE);


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

 
Код:
IUnknown* pPlugin = NULL;
IBaseFilter *pGrabberF = NULL;

// А вот тут вываливается ошибка: No interface
hr = pPlugin->QueryInterface(IID_IBaseFilter, (void**)&pGrabberF);


Я поискал по разным форумам, и вот что нашел:

"It appears there is a serious bug with the WMEncTransform::GetTransformPlugin() function in Windows Media
Encoder 9. Instead of giving you the IUnknown pointer to your plugin it's giving you the IUnknown pointer to their own WMEncTransformPluginWrapper
object.."

Никто не знает, как это можно забороть?
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог