IWMEncAudienceObj* pAudience=NULL;
.......
pAudience->put_VideoBufferSize //(задает размер буфера в миллисекундах)
pAudience->put_VideoFPS //(задает число кадров в секунду)
Windows Media Encoder SDK - как получить фреймы из видеопотока
столкнулся с проблемой - использую Windows Media Encoder 9 SDK для кодирования видеопотока. Не знает ли кто, возможно ли вытащить из потока кадры? Существует куча методов для задания параметров буфера потока, например
Код:
и пр. параметры.
Но вот как получить указатель на область памяти, содержащий кадр?
Может быть, кто-нибудь сталкивался?
прям специализированного интерфейса я даже и не слыхал но в Windows Media Encoder есть замечательная вешь как плагины котрые позволяют реализовать различного рода фичеры. есть один тип таких плагинов как трансформера которые позволяют влиять на видео и аудио потоки. Cоздаются они очень просто: создаешь Transform DirectShow фильтер и реализуешь в нем сохранение RAW фреймов на диск либо комутируешся со своим приложением и отдаешь ему.
Цитата: Zushenskiy
прям специализированного интерфейса я даже и не слыхал но в Windows Media Encoder есть замечательная вешь как плагины котрые позволяют реализовать различного рода фичеры. есть один тип таких плагинов как трансформера которые позволяют влиять на видео и аудио потоки. Cоздаются они очень просто: создаешь Transform DirectShow фильтер и реализуешь в нем сохранение RAW фреймов на диск либо комутируешся со своим приложением и отдаешь ему.
Спасибо за идею :) попробую )
Код:
hr = pSrcGrp->get_GroupTransformCollection(&pTransColl);
hr = pTransColl->Add(&pTransform);
//В качестве инпута передается схема плагина - не могу понять,
// что передавать в качестве имени схемы имея директ-шоу фильтр
hr = pTransform->SetInput( CComBSTR("Название_Схемы_Плагина"));
hr = pTransColl->Add(&pTransform);
//В качестве инпута передается схема плагина - не могу понять,
// что передавать в качестве имени схемы имея директ-шоу фильтр
hr = pTransform->SetInput( CComBSTR("Название_Схемы_Плагина"));
Что передавать в качестве Название_СХемы_Плагина чтобы использовать нужный Ком-объект?
Может быть, кто-то сталкивался?
hr=pTransform->SetInput(CComBSTR("TCGroupTransformPlugin://SampleGrabber1"));
Вот привожу кусок кода, может быть, подскажите, где туплю...
если убрать три строчки, связанные с 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);
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);
Код:
hr = pSrc->get_TransformCollection(&pTransColl);
hr = pTransColl->Add(&pTransform);
hr = pTransform->SetInput( CComBSTR("TransformPluginWrapper://SampleGrabber"));
// После такого объявления инициализация проходит успешно
hr=g_pEncoder->PrepareToEncode(VARIANT_TRUE);
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);
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.."
Никто не знает, как это можно забороть?