C#+DirectShow+VMR9... help!!!

monsky

Гость города
#1
Народ, помогите зеленому, бъюсь уже второй день.

Строю аппликацию для захвата живого видео с аналоговой карточки, причем хочу использовать VMR9, чтобы с его помощью и картинки грабить, и яркость с контрастностью регулировать (но до этого я еще не дошел).
Пока работаю в оконном режиме, все тип-топ:

private void SetupGraph(DsDevice dev, int iWidth, int iHeight, short iBPP, Control hControl)
{
int hr;

IBaseFilter capFilter = null;

// Get the graphbuilder object
m_graphBuilder = new FilterGraph() as IFilterGraph2;

try
{
#if DEBUG
m_rot = new DsROTEntry(m_graphBuilder);
#endif
ICaptureGraphBuilder2 captureGraphBuilder = (ICaptureGraphBuilder2)new CaptureGraphBuilder2();
hr = captureGraphBuilder.SetFiltergraph(m_graphBuilder);
DsError.ThrowExceptionForHR(hr);

vmr = (IBaseFilter)new VideoMixingRenderer9();
hr = m_graphBuilder.AddFilter(vmr, "VMR9");
DsError.ThrowExceptionForHR(hr);

//IVMRFilterConfig9 vmrFilterConfig = (IVMRFilterConfig9)vmr;
//hr = vmrFilterConfig.SetRenderingMode(VMR9Mode.Windowless);
//DsError.ThrowExceptionForHR(hr);

//IVMRWindowlessControl9 vmrWindowsless = (IVMRWindowlessControl9)vmr;
//hr = vmrWindowsless.SetVideoClippingWindow(hControl.Handle);
//DsError.ThrowExceptionForHR(hr);

// add the video input device
hr = m_graphBuilder.AddSourceFilterForMoniker(dev.Mon, null, dev.Name, out capFilter);
DsError.ThrowExceptionForHR(hr);

object o = null;
Guid iid = typeof(IAMStreamConfig).GUID;
hr = captureGraphBuilder.FindInterface(DsGuid.FromGuid(PinCategory.Capture), DsGuid.FromGuid(MediaType.Interleaved), capFilter, DsGuid.FromGuid(iid), out o);

hr = captureGraphBuilder.RenderStream(null, null, capFilter, null, vmr);
DsError.ThrowExceptionForHR(hr);

ConfigVideoWindow(hControl);

// Start the graph
IMediaControl mediaCtrl = m_graphBuilder as IMediaControl;
hr = mediaCtrl.Run();
DsError.ThrowExceptionForHR( hr );
}
finally
{
}
}
Если же пытаюсь перейти на безоконный режим, то нифига не вижу, хотя GraphBuilder подключается и показывает граф нормально.
(Для безоконного режима в этой функции надо раскомментировать соответствующие строки и закомментировать ConfigVideoWindow(hControl)

НУ ЧТО Я ДЕЛАЮ НЕ ТАК???
 

Dimapolius

Житель города
#2
Ответ: C#+DirectShow+VMR9... help!!!

Автор сообщения monsky
Народ, помогите зеленому, бъюсь уже второй день.

Строю аппликацию для захвата живого видео с аналоговой карточки, причем хочу использовать VMR9, чтобы с его помощью и картинки грабить, и яркость с контрастностью регулировать (но до этого я еще не дошел).
Пока работаю в оконном режиме, все тип-топ:

private void SetupGraph(DsDevice dev, int iWidth, int iHeight, short iBPP, Control hControl)
{
int hr;

IBaseFilter capFilter = null;

// Get the graphbuilder object
m_graphBuilder = new FilterGraph() as IFilterGraph2;

try
{
#if DEBUG
m_rot = new DsROTEntry(m_graphBuilder);
#endif
ICaptureGraphBuilder2 captureGraphBuilder = (ICaptureGraphBuilder2)new CaptureGraphBuilder2();
hr = captureGraphBuilder.SetFiltergraph(m_graphBuilder);
DsError.ThrowExceptionForHR(hr);

vmr = (IBaseFilter)new VideoMixingRenderer9();
hr = m_graphBuilder.AddFilter(vmr, "VMR9");
DsError.ThrowExceptionForHR(hr);

//IVMRFilterConfig9 vmrFilterConfig = (IVMRFilterConfig9)vmr;
//hr = vmrFilterConfig.SetRenderingMode(VMR9Mode.Windowless);
//DsError.ThrowExceptionForHR(hr);

//IVMRWindowlessControl9 vmrWindowsless = (IVMRWindowlessControl9)vmr;
//hr = vmrWindowsless.SetVideoClippingWindow(hControl.Handle);
//DsError.ThrowExceptionForHR(hr);

// add the video input device
hr = m_graphBuilder.AddSourceFilterForMoniker(dev.Mon, null, dev.Name, out capFilter);
DsError.ThrowExceptionForHR(hr);

object o = null;
Guid iid = typeof(IAMStreamConfig).GUID;
hr = captureGraphBuilder.FindInterface(DsGuid.FromGuid(PinCategory.Capture), DsGuid.FromGuid(MediaType.Interleaved), capFilter, DsGuid.FromGuid(iid), out o);

hr = captureGraphBuilder.RenderStream(null, null, capFilter, null, vmr);
DsError.ThrowExceptionForHR(hr);

ConfigVideoWindow(hControl);

// Start the graph
IMediaControl mediaCtrl = m_graphBuilder as IMediaControl;
hr = mediaCtrl.Run();
DsError.ThrowExceptionForHR( hr );
}
finally
{
}
}
Если же пытаюсь перейти на безоконный режим, то нифига не вижу, хотя GraphBuilder подключается и показывает граф нормально.
(Для безоконного режима в этой функции надо раскомментировать соответствующие строки и закомментировать ConfigVideoWindow(hControl)

НУ ЧТО Я ДЕЛАЮ НЕ ТАК???
углубись в маны...в экранной версии окна 2к и некоторые нт ....не разрешают отображать графику...при вызове данных функций (мотивирую лишь офф манами) ...
 

Dimapolius

Житель города
#3
тебе следует перед вызовом функций рисования ...задать системный обьект задающий поверхность отображения ...аля поверхность кот именно распространяеться...на экранную и фуллл экранную версию!...причём мелкософт прописал это в манах...не хошь читать маны ..лезь на форум ..=)