TL> (CapturePin) -> SampleGrabber -> NullRender
TL> (PreviewPin) -> VideoRender
TL> При запуске получаю одно окно с изображением в моей программе и второе
TL> окно отдельно. В обоих окнах - изображение с карты захвата. Второе окно
TL> можно даже закрыть.
А NullRender у тебя случайно не равен Null?
Regards, Sergei Shvaiko: gli...@rambler.ru ICQ: 52622425
> А NullRender у тебя случайно не равен Null?
Хм... интересная идея :) Посмотрел - нет, не равен. Проверка есть что
NullRender не равен Null. Что еще может быть?
Такая штука, с вторым окном происходит только на Radeon 9000 (на нем есть
видеовход)
TL> Хм... интересная идея :) Посмотрел - нет, не равен. Проверка есть что
TL> NullRender не равен Null. Что еще может быть?
TL> Такая штука, с вторым окном происходит только на Radeon 9000 (на нем
TL> есть видеовход)
А на других нет видеовхода? С чего тогда захватываешь?
Попробуй сохранить граф на диск и открыть потом в графедите. Ибо без кода
трудно что-нить посоветовать.
:) есть. Просто моя программа дает такой интересный эффект только на этой
карте. В остальных случаях... на специализированных картах для захвата видео -
все нормально.
> Попробуй сохранить граф на диск и открыть потом в графедите. Ибо без кода
> трудно что-нить посоветовать.
Дело в том, что физически этой карты у меня нет... она у пользователя
стоит... поэтому сохранение графа на диск ничего не даст. Ведь когда я этот
файл буду просматривать уже у себя на машине, ничего полезного не увижу.
Вот мой код... может он чем поможет (проверки сознательно откушены):
CComPtr< ICaptureGraphBuilder2 > m_pBuilder;
CComPtr< IGraphBuilder > m_pGraph;
CComPtr< ISampleGrabber > m_pGrabber;
CComPtr< IBaseFilter > m_pCap;
//создаем граф и графбилдер
m_pBuilder.CoCreateInstance( CLSID_CaptureGraphBuilder2 );
m_pGraph.CoCreateInstance( CLSID_FilterGraph );
//передаем граф графбилдеру
m_pBuilder->SetFiltergraph( m_pGraph );
//ищем дефалтное устройство захвата, добавляем в граф
GetDefaultCapDevice( &m_pCap );
m_pGraph->AddFilter( m_pCap, L"Cap" );
//создаем SampleGrabber, добавляем в граф
m_pGrabber.CoCreateInstance( CLSID_SampleGrabber );
CComQIPtr< IBaseFilter, &IID_IBaseFilter > pGrabBase( m_pGrabber );
m_pGraph->AddFilter( pGrabBase, L"Grabber" );
//создаем NullRenderer, добавляем в граф
CComPtr< IBaseFilter > pNullRenderer;
pNullRenderer.CoCreateInstance( CLSID_NullRenderer );
m_pGraph->AddFilter( pNullRenderer, L"NullRenderer" );
//устанавливаем медиа-тип для SampleGrabber
AM_MEDIA_TYPE mt;
ZeroMemory( &mt, sizeof(mt) );
mt.majortype = MEDIATYPE_Video;
mt.subtype = MEDIASUBTYPE_RGB24;
m_pGrabber->SetMediaType( &mt );
//настраиваем SampleGrabber, передаем указатель на интерфейс для обратного
вызова
m_pGrabber->SetBufferSamples( FALSE );
m_pGrabber->SetOneShot( FALSE );
m_pGrabber->SetCallback( &Grabber, 1 );
//рендерим CapturePin через SampleGrabber на NullRenderer
m_pBuilder->RenderStream(
&PIN_CATEGORY_CAPTURE, // Pin category
&MEDIATYPE_Video, // Media type
m_pCap, // Capture filter
pGrabBase, // Compression filter (optional)
pNullRenderer // Multiplexer or renderer filter
);
//рендерим PreviewPin (должен использоваться рендер по-умолчанию - Video
Renderer)
m_pBuilder->RenderStream(
&PIN_CATEGORY_PREVIEW, // Pin category
&MEDIATYPE_Video, // Media type
m_pCap, // Capture filter
NULL, // Compression filter (optional)
NULL // Multiplexer or renderer filter
);
//получаем интерфейс IVideoWindow
CComQIPtr< IVideoWindow, &IID_IVideoWindow > pWindow = m_pGraph;
//работаем с ним ...
pWindow->put_Owner( (OAHWND) Parent );
pWindow->put_WindowStyle( WS_CHILD | WS_CLIPSIBLINGS );
>> Попробуй сохранить граф на диск и открыть потом в графедите. Ибо без
TL> Дело в том, что физически этой карты у меня нет... она у пользователя
TL> стоит... поэтому сохранение графа на диск ничего не даст. Ведь когда я
TL> этот файл буду просматривать уже у себя на машине, ничего полезного не
TL> увижу.
Так дай ему графедит пусть скриншот сделает.