DirectShowでフルスクリーンでの動画再生方法について

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
Hashimo

DirectShowでフルスクリーンでの動画再生方法について

#1

投稿記事 by Hashimo » 15年前

はじめまして。

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();

Justy

Re:DirectShowでフルスクリーンでの動画再生方法について

#2

投稿記事 by Justy » 15年前

IVideoWindow::put_FullScreenMode
http://msdn.microsoft.com/ja-jp/library/cc369761.aspx

 再生を開始する前に、これはどこかで呼んでいますか?

Hashimo

Re:DirectShowでフルスクリーンでの動画再生方法について

#3

投稿記事 by Hashimo » 15年前

IVideoWindow::put_FullScreenModeは使っておりません。
フルスクリーン状態でput_FullScreenModeを使いますと、フルスクリーン表示になりませんでした。
フルスクリーンの解像度は640*480、動画の解像度も640*480なのですが、なぜが左上に小さく表示されます。
ウインドウモード状態でput_FullScreenModeを使いますと動画再生時の表示はフルスクリーンになるのですが、
フルスクリーン状態から切り替えなしに動画再生をする必要があるため困っております。
画像

Justy

Re:DirectShowでフルスクリーンでの動画再生方法について

#4

投稿記事 by Justy » 15年前

 なるほど。そうですか。

 んー、再現できる全体のコード(ウインドウの生成とかフルスクリーン化のあたりとか)が
あるといいんですが。
 
 フルスクリーンウインドウって ChangeDisplaySettings()と併用して作ったものですか?


#追記 簡単なフルスクリーンの動画再生サンプルを作ってみました。
 PlayMovie関数は再生待ちと解放周りを追加しただけで、Hashimoさんが書かれたコードと
ほとんど変わりはありません。
 左クリックでフルスクリーン化、右クリックで再生開始です。
 再生中はウインドウ処理が全部止まっていますので注意して下さい。
 MovieFilePath変数が動画ファイルパスになっています。適当に変えて試してみて下さい。
画像

閉鎖

“C言語何でも質問掲示板” へ戻る