DirectShowでフルスクリーンでの動画再生方法について
Posted: 2010年5月15日(土) 15:18
はじめまして。
DirectShowで動画再生のプログラムを作っているのですが、
表示ウインドウがフルスクリーンモードの状態で動画再生を行うと画面が黒いままで表示がされない現象があり困っております。
お詳しい方おられましたら教えていただきたいです。
現状は、
ウインドウモードの状態から動画再生を行うと正常に再生されます。
フルスクリーンモードでは、正常に再生されたり、表示がされなかったり不安定です。
BGMは正しく鳴っています。
ソースコード
IGraphBuilder *m_pGraphBuilder;
IMediaControl *m_pMediaControl;
IMediaEventEx *m_pMediaEvent;
IMediaSeeking *m_pMediaSeek;
IVideoWindow *m_pVideoWindow;
HRESULT hr;
// COMを初期化
hr = CoInitialize(NULL);
if (FAILED(hr))
{
return S_FALSE;
}
// FilterGraphを生成
hr = CoCreateInstance ( CLSID_FilterGraph,
NULL,
CLSCTX_INPROC_SERVER,
IID_IGraphBuilder,
(VOID **)&m_pGraphBuilder);
if (FAILED(hr))
{
return S_FALSE;
}
// MediaControlインターフェース取得
hr = m_pGraphBuilder->QueryInterface(IID_IMediaControl,
(VOID **)&m_pMediaControl);
if (FAILED(hr))
{
return S_FALSE;
}
hr = m_pGraphBuilder->QueryInterface(IID_IMediaEvent,
(VOID **)&m_pMediaEvent);
if (FAILED(hr))
{
return S_FALSE;
}
hr = m_pGraphBuilder->QueryInterface(IID_IMediaSeeking,
(VOID **)&m_pMediaSeek);
if (FAILED(hr))
{
return S_FALSE;
}
hr = m_pGraphBuilder->QueryInterface(IID_IVideoWindow,
(VOID **)&m_pVideoWindow);
if (FAILED(hr))
{
return S_FALSE;
}
// Graphを生成
hr = m_pGraphBuilder->RenderFile(wstrSearchPath, NULL);
if (FAILED(hr))
{
return S_FALSE;
}
LONGLONG Current;
LONGLONG Stop;
hr = m_pMediaSeek->GetAvailable( &Current, &Stop );
hr = m_pVideoWindow->put_Owner((OAHWND)hWindow);
if (FAILED(hr))
{
return S_FALSE;
}
hr = m_pVideoWindow->put_WindowStyle(WS_CHILD|WS_CLIPSIBLINGS);
if (FAILED(hr))
{
return S_FALSE;
}
RECT rect;
GetClientRect ( hWindow, &rect );
hr = m_pVideoWindow->SetWindowPosition( 0, 0, rect.right, rect.bottom );
if (FAILED(hr))
{
return S_FALSE;
}
// 再生開始
hr = m_pMediaControl->Run();
DirectShowで動画再生のプログラムを作っているのですが、
表示ウインドウがフルスクリーンモードの状態で動画再生を行うと画面が黒いままで表示がされない現象があり困っております。
お詳しい方おられましたら教えていただきたいです。
現状は、
ウインドウモードの状態から動画再生を行うと正常に再生されます。
フルスクリーンモードでは、正常に再生されたり、表示がされなかったり不安定です。
BGMは正しく鳴っています。
ソースコード
IGraphBuilder *m_pGraphBuilder;
IMediaControl *m_pMediaControl;
IMediaEventEx *m_pMediaEvent;
IMediaSeeking *m_pMediaSeek;
IVideoWindow *m_pVideoWindow;
HRESULT hr;
// COMを初期化
hr = CoInitialize(NULL);
if (FAILED(hr))
{
return S_FALSE;
}
// FilterGraphを生成
hr = CoCreateInstance ( CLSID_FilterGraph,
NULL,
CLSCTX_INPROC_SERVER,
IID_IGraphBuilder,
(VOID **)&m_pGraphBuilder);
if (FAILED(hr))
{
return S_FALSE;
}
// MediaControlインターフェース取得
hr = m_pGraphBuilder->QueryInterface(IID_IMediaControl,
(VOID **)&m_pMediaControl);
if (FAILED(hr))
{
return S_FALSE;
}
hr = m_pGraphBuilder->QueryInterface(IID_IMediaEvent,
(VOID **)&m_pMediaEvent);
if (FAILED(hr))
{
return S_FALSE;
}
hr = m_pGraphBuilder->QueryInterface(IID_IMediaSeeking,
(VOID **)&m_pMediaSeek);
if (FAILED(hr))
{
return S_FALSE;
}
hr = m_pGraphBuilder->QueryInterface(IID_IVideoWindow,
(VOID **)&m_pVideoWindow);
if (FAILED(hr))
{
return S_FALSE;
}
// Graphを生成
hr = m_pGraphBuilder->RenderFile(wstrSearchPath, NULL);
if (FAILED(hr))
{
return S_FALSE;
}
LONGLONG Current;
LONGLONG Stop;
hr = m_pMediaSeek->GetAvailable( &Current, &Stop );
hr = m_pVideoWindow->put_Owner((OAHWND)hWindow);
if (FAILED(hr))
{
return S_FALSE;
}
hr = m_pVideoWindow->put_WindowStyle(WS_CHILD|WS_CLIPSIBLINGS);
if (FAILED(hr))
{
return S_FALSE;
}
RECT rect;
GetClientRect ( hWindow, &rect );
hr = m_pVideoWindow->SetWindowPosition( 0, 0, rect.right, rect.bottom );
if (FAILED(hr))
{
return S_FALSE;
}
// 再生開始
hr = m_pMediaControl->Run();