掲示板一覧:[4 ゲーム開発・創作仲間募集(依頼先を探している方一覧)] [5 ゲーム・創作のお仕事募集(依頼を請け負っている方一覧)] (閉鎖:[1 初心者・質問] [2 ゲーム攻略] [3 ゲーム開発・創作の話題])
便利リンク1:[ふりーむ] [ゲーム制作ツール集(素材リンク集)] [素材ライブラリ]
便利リンク2:[イラスト投稿(サンプルやポートフォリオ用に)] [ふりーむプレミアムサービス(外部広告の削減を目指して取り組んでいます)]
下記掲示板は投稿の受付を終了しました(投稿できません)。一定期間後に公開も終了されます。2005年からご愛用頂きありがとうございました。なお、上記掲示板一覧の「4」「5」は現段階では「様子見」でしばらく投稿可能です。
便利リンク1:[ふりーむ] [ゲーム制作ツール集(素材リンク集)] [素材ライブラリ]
便利リンク2:[イラスト投稿(サンプルやポートフォリオ用に)] [ふりーむプレミアムサービス(外部広告の削減を目指して取り組んでいます)]
下記掲示板は投稿の受付を終了しました(投稿できません)。一定期間後に公開も終了されます。2005年からご愛用頂きありがとうございました。なお、上記掲示板一覧の「4」「5」は現段階では「様子見」でしばらく投稿可能です。
ゲームのdshowメディア再生-はじめから
件名 | : Re: ゲームのdshowメディア再生-はじめから |
投稿日 | : 2007/06/16 11:36 |
投稿者 | : とおりすがりのPG |
コメントがデンジャラス
ほかにもつっこみどころ多いけど、おしえない
あとじゃま、わざわざここに書く必要なし
ほかにもつっこみどころ多いけど、おしえない
あとじゃま、わざわざここに書く必要なし
件名 | : Re: ゲームのdshowメディア再生-はじめから |
投稿日 | : 2007/06/04 15:41 |
投稿者 | : instemast |
6>>まだ少ないってこと?(倒れ)
7>>ゲームプログラマーがメディア再生できるためだぞぃ
7>>ゲームプログラマーがメディア再生できるためだぞぃ
件名 | : Re: ゲームのdshowメディア再生-はじめから |
投稿日 | : 2007/06/03 20:12 |
投稿者 | : gdgd |
何人だか知りませんけど何でそれをここに書こうと思ったんですか?
http://coffeejp.com/bbs/viewthread.php?tid=155279&extra=page%3D1
http://coffeejp.com/bbs/viewthread.php?tid=155279&extra=page%3D1
件名 | : Re: ゲームのdshowメディア再生-はじめから |
投稿日 | : 2007/06/02 23:21 |
投稿者 | : xx |
それでは、そのソースコードにコメントを付け加えてください。
今の状態ではコメント部分が少なすぎます。
今の状態ではコメント部分が少なすぎます。
件名 | : Re: ゲームのdshowメディア再生-はじめから |
投稿日 | : 2007/06/01 00:56 |
投稿者 | : 通りすがり |
どうして自分の書いたものではないソースコードを、さも自分が書いたように貼り付けているのでしょうか?
書いた人の許可はもらいましたか?
ソースコードにも、きちんと著作権があるのですよ。
書いた人の許可はもらいましたか?
ソースコードにも、きちんと著作権があるのですよ。
件名 | : Re: ゲームのdshowメディア再生-はじめから |
投稿日 | : 2007/05/31 15:54 |
投稿者 | : instemast |
renderfileしてからfullscreenmodeをセットしてね、
でなきゃエラーが起こりますからね!
pGraphBuilder->RenderFile(FileName,NULL);
pVideoWindow->put_FullScreenMode(OATRUE);
ファイルを閉じる方法は次の如し:
(一番簡単な方法です)
safe(m_pMediaControl)->Stop();
safe(m_pBasicAudio)->Release();
safe(m_pBasicVideo)->Release();
safe(m_pVideoWindow)->Release();
safe(m_pMediaEventEx)->Release();
safe(m_pMediaPosition)->Release();
safe(m_pMediaControl)->Release();
safe(m_pGraphBuilder)->Release();
でなきゃエラーが起こりますからね!
pGraphBuilder->RenderFile(FileName,NULL);
pVideoWindow->put_FullScreenMode(OATRUE);
ファイルを閉じる方法は次の如し:
(一番簡単な方法です)
safe(m_pMediaControl)->Stop();
safe(m_pBasicAudio)->Release();
safe(m_pBasicVideo)->Release();
safe(m_pVideoWindow)->Release();
safe(m_pMediaEventEx)->Release();
safe(m_pMediaPosition)->Release();
safe(m_pMediaControl)->Release();
safe(m_pGraphBuilder)->Release();
件名 | : Re: ゲームのdshowメディア再生-はじめから |
投稿日 | : 2007/05/31 15:51 |
投稿者 | : instemast |
3。ゲームについてコーディングし進みます。
(一時停止/ループ/Escでビデオ再生をスキップなど)
違った方法でループ再生:
タイマーも使って、1000msごとに再生位置をチェックし、
終わりだったらモッペン再生。
#include <dshow.h>
#include <windows.h>
#pragma comment (lib,"Ole32.lib")
#pragma comment (lib,"Strmiids.lib")
#define ture (bool)-1
//you should REPLACE the media file path
#define FILENAME L"C:\\Documents and Settings\\vs6\\桌面\\temp\\FL5007822001-500-2.avi"
#define WM_GRAPH_NOTIFY (WM_APP + 1) //the msg of g_pMediaEventEx
bool g_bExit=false; //this APP will be exited when g_bExit=TURE
HWND g_hwnd=0; //our player's main window
IMediaEventEx *g_pMediaEventEx; //recieve event msgs from directshow
//it notifies us when the media's playing is COMPLETE
IMediaControl *g_pMediaControl; //help us to link the filters(media file,codec...),
//in short,it helps us open and play a file EASILY.
IMediaPosition *g_pMediaPosition; //we use this to get/set the POSITION of a media's playing
double g_Len;
bool g_bIsPlaying=false;
LRESULT WINAPI WinProc(HWND,UINT,WPARAM,LPARAM);
void WINAPI OnTimer(HWND, UINT, UINT, DWORD);
int WINAPI WinMain(HINSTANCE hInst,HINSTANCE hPrevInst,LPSTR CmdLine,int nShowCmd)
{
IGraphBuilder *pGraphBuilder; //this is the kernel of directshow
IVideoWindow *pVideoWindow; //use this to control the video window of directshow
//init COM
CoInitialize(NULL);
//create FilterGraph:
CoCreateInstance(CLSID_FilterGraph,NULL,CLSCTX_INPROC,IID_IGraphBuilder,
(LPVOID*)&pGraphBuilder);
//ask directshow for the MediaControl:
pGraphBuilder->QueryInterface(IID_IMediaControl,(LPVOID*)&g_pMediaControl);
//ask directshow for the MediaPosition:
pGraphBuilder->QueryInterface(IID_IMediaPosition,(LPVOID*)&g_pMediaPosition);
//ask directshow for the MediaEventEx:
pGraphBuilder->QueryInterface(IID_IMediaEventEx,(LPVOID*)&g_pMediaEventEx);
//start to create a window and show it
WNDCLASSEX wc={sizeof(WNDCLASSEX),CS_CLASSDC,WinProc,0L,0L,
GetModuleHandle(0),0,0,0,0,"instemast",0};
RegisterClassEx(&wc);
//our window's CLIENT positions:
RECT rect={100,100,640+100-1,480+100-1};//width=right-left+1 , right=left+width-1
//calculate our window's REAL positions from client positions:
::AdjustWindowRect(&rect,WS_OVERLAPPEDWINDOW,false);
//NOW, rect's values are updated
g_hwnd=CreateWindow("instemast","Esc=stop Space=pause/play F1=speed+ F2=speed- F3=normal",WS_OVERLAPPEDWINDOW,rect.left,rect.top,
rect.right-rect.left,rect.bottom-rect.top,0,0,wc.hInstance,0);
::ShowWindow(g_hwnd,nShowCmd);
//end of creating window
//we will recieve directshow's msg by g_hwnd:
g_pMediaEventEx->SetNotifyWindow((OAHWND)g_hwnd,WM_GRAPH_NOTIFY, NULL);
//create Graph:
g_pMediaControl->RenderFile(FILENAME);
//get our media's length:
g_pMediaPosition->get_Duration(&g_Len);
//ask directshow for the VideoWindow interface:
pGraphBuilder->QueryInterface(IID_IVideoWindow,(LPVOID*)&pVideoWindow);
pVideoWindow->put_Owner((OAHWND)g_hwnd); //VIDEOwindow is the child of OUR g_hwnd
pVideoWindow->put_WindowStyle(WS_CHILD|WS_CLIPSIBLINGS);
pVideoWindow->SetWindowPosition(0,0,rect.right-rect.left+1,rect.bottom-rect.top+1);
pVideoWindow->put_Visible(OATRUE);
//start playing media:
g_pMediaControl->Run();
g_bIsPlaying=ture;
::SetTimer(g_hwnd,0,1000,&OnTimer);
MSG msg;
do
{
GetMessage(&msg,0,0,0);
::TranslateMessage(&msg);
::DispatchMessage(&msg);
}while(!g_bExit); //do msg loop,until g_bExit=TURE
//release the resource:
g_pMediaEventEx->Release();
pVideoWindow->Release();
g_pMediaControl->Release();
pGraphBuilder->Release();
//COM destroy:
CoUninitialize();
return 0;
}
LRESULT WINAPI WinProc(HWND hwnd,UINT msg,WPARAM wparam,LPARAM lparam)
{
double rate;
switch(msg)
{
case WM_KEYDOWN:
switch(wparam)
{
case 27: //[Esc] key--Stop media
g_pMediaControl->Stop(); //stop media
g_bIsPlaying=false;
//show FIRST frame:
g_pMediaPosition->put_CurrentPosition(0);
g_pMediaControl->Run();
::Sleep(2);
g_pMediaControl->Pause();
//stop media:
g_pMediaPosition->put_CurrentPosition(0);
g_pMediaControl->Stop();
break;
case ' ': //pause or resume or play
if(g_bIsPlaying)
{
g_pMediaControl->Pause();
g_bIsPlaying=false;
}
else
{
g_pMediaControl->Run();
g_bIsPlaying=ture;
};
break;
case VK_F1: //rate(speed): 1.0=normal
g_pMediaPosition->get_Rate(&rate);
g_pMediaPosition->put_Rate(rate*1.25);
break;
case VK_F2:
g_pMediaPosition->get_Rate(&rate);
g_pMediaPosition->put_Rate(rate*0.8);
break;
case VK_F3:
g_pMediaPosition->put_Rate(1.0);
};
break;
case WM_DESTROY:
g_pMediaControl->Stop(); //stop our media
g_bIsPlaying=false;
g_bExit=ture; //our g_hwnd has been closed,so we want to exit the app
break;
};
return DefWindowProc(hwnd,msg,wparam,lparam);
}
void WINAPI OnTimer(HWND hwnd, UINT, UINT, DWORD)
{
double pos;
g_pMediaPosition->get_CurrentPosition(&pos);
if(pos>=g_Len)
{
g_pMediaPosition->put_CurrentPosition(0);
g_pMediaControl->Run();
};
}
(一時停止/ループ/Escでビデオ再生をスキップなど)
違った方法でループ再生:
タイマーも使って、1000msごとに再生位置をチェックし、
終わりだったらモッペン再生。
#include <dshow.h>
#include <windows.h>
#pragma comment (lib,"Ole32.lib")
#pragma comment (lib,"Strmiids.lib")
#define ture (bool)-1
//you should REPLACE the media file path
#define FILENAME L"C:\\Documents and Settings\\vs6\\桌面\\temp\\FL5007822001-500-2.avi"
#define WM_GRAPH_NOTIFY (WM_APP + 1) //the msg of g_pMediaEventEx
bool g_bExit=false; //this APP will be exited when g_bExit=TURE
HWND g_hwnd=0; //our player's main window
IMediaEventEx *g_pMediaEventEx; //recieve event msgs from directshow
//it notifies us when the media's playing is COMPLETE
IMediaControl *g_pMediaControl; //help us to link the filters(media file,codec...),
//in short,it helps us open and play a file EASILY.
IMediaPosition *g_pMediaPosition; //we use this to get/set the POSITION of a media's playing
double g_Len;
bool g_bIsPlaying=false;
LRESULT WINAPI WinProc(HWND,UINT,WPARAM,LPARAM);
void WINAPI OnTimer(HWND, UINT, UINT, DWORD);
int WINAPI WinMain(HINSTANCE hInst,HINSTANCE hPrevInst,LPSTR CmdLine,int nShowCmd)
{
IGraphBuilder *pGraphBuilder; //this is the kernel of directshow
IVideoWindow *pVideoWindow; //use this to control the video window of directshow
//init COM
CoInitialize(NULL);
//create FilterGraph:
CoCreateInstance(CLSID_FilterGraph,NULL,CLSCTX_INPROC,IID_IGraphBuilder,
(LPVOID*)&pGraphBuilder);
//ask directshow for the MediaControl:
pGraphBuilder->QueryInterface(IID_IMediaControl,(LPVOID*)&g_pMediaControl);
//ask directshow for the MediaPosition:
pGraphBuilder->QueryInterface(IID_IMediaPosition,(LPVOID*)&g_pMediaPosition);
//ask directshow for the MediaEventEx:
pGraphBuilder->QueryInterface(IID_IMediaEventEx,(LPVOID*)&g_pMediaEventEx);
//start to create a window and show it
WNDCLASSEX wc={sizeof(WNDCLASSEX),CS_CLASSDC,WinProc,0L,0L,
GetModuleHandle(0),0,0,0,0,"instemast",0};
RegisterClassEx(&wc);
//our window's CLIENT positions:
RECT rect={100,100,640+100-1,480+100-1};//width=right-left+1 , right=left+width-1
//calculate our window's REAL positions from client positions:
::AdjustWindowRect(&rect,WS_OVERLAPPEDWINDOW,false);
//NOW, rect's values are updated
g_hwnd=CreateWindow("instemast","Esc=stop Space=pause/play F1=speed+ F2=speed- F3=normal",WS_OVERLAPPEDWINDOW,rect.left,rect.top,
rect.right-rect.left,rect.bottom-rect.top,0,0,wc.hInstance,0);
::ShowWindow(g_hwnd,nShowCmd);
//end of creating window
//we will recieve directshow's msg by g_hwnd:
g_pMediaEventEx->SetNotifyWindow((OAHWND)g_hwnd,WM_GRAPH_NOTIFY, NULL);
//create Graph:
g_pMediaControl->RenderFile(FILENAME);
//get our media's length:
g_pMediaPosition->get_Duration(&g_Len);
//ask directshow for the VideoWindow interface:
pGraphBuilder->QueryInterface(IID_IVideoWindow,(LPVOID*)&pVideoWindow);
pVideoWindow->put_Owner((OAHWND)g_hwnd); //VIDEOwindow is the child of OUR g_hwnd
pVideoWindow->put_WindowStyle(WS_CHILD|WS_CLIPSIBLINGS);
pVideoWindow->SetWindowPosition(0,0,rect.right-rect.left+1,rect.bottom-rect.top+1);
pVideoWindow->put_Visible(OATRUE);
//start playing media:
g_pMediaControl->Run();
g_bIsPlaying=ture;
::SetTimer(g_hwnd,0,1000,&OnTimer);
MSG msg;
do
{
GetMessage(&msg,0,0,0);
::TranslateMessage(&msg);
::DispatchMessage(&msg);
}while(!g_bExit); //do msg loop,until g_bExit=TURE
//release the resource:
g_pMediaEventEx->Release();
pVideoWindow->Release();
g_pMediaControl->Release();
pGraphBuilder->Release();
//COM destroy:
CoUninitialize();
return 0;
}
LRESULT WINAPI WinProc(HWND hwnd,UINT msg,WPARAM wparam,LPARAM lparam)
{
double rate;
switch(msg)
{
case WM_KEYDOWN:
switch(wparam)
{
case 27: //[Esc] key--Stop media
g_pMediaControl->Stop(); //stop media
g_bIsPlaying=false;
//show FIRST frame:
g_pMediaPosition->put_CurrentPosition(0);
g_pMediaControl->Run();
::Sleep(2);
g_pMediaControl->Pause();
//stop media:
g_pMediaPosition->put_CurrentPosition(0);
g_pMediaControl->Stop();
break;
case ' ': //pause or resume or play
if(g_bIsPlaying)
{
g_pMediaControl->Pause();
g_bIsPlaying=false;
}
else
{
g_pMediaControl->Run();
g_bIsPlaying=ture;
};
break;
case VK_F1: //rate(speed): 1.0=normal
g_pMediaPosition->get_Rate(&rate);
g_pMediaPosition->put_Rate(rate*1.25);
break;
case VK_F2:
g_pMediaPosition->get_Rate(&rate);
g_pMediaPosition->put_Rate(rate*0.8);
break;
case VK_F3:
g_pMediaPosition->put_Rate(1.0);
};
break;
case WM_DESTROY:
g_pMediaControl->Stop(); //stop our media
g_bIsPlaying=false;
g_bExit=ture; //our g_hwnd has been closed,so we want to exit the app
break;
};
return DefWindowProc(hwnd,msg,wparam,lparam);
}
void WINAPI OnTimer(HWND hwnd, UINT, UINT, DWORD)
{
double pos;
g_pMediaPosition->get_CurrentPosition(&pos);
if(pos>=g_Len)
{
g_pMediaPosition->put_CurrentPosition(0);
g_pMediaControl->Run();
};
}
件名 | : Re: ゲームのdshowメディア再生-はじめから |
投稿日 | : 2007/05/31 15:45 |
投稿者 | : instemast |
2。自前ウィンドウ中でループ再生
ループ再生するよう、「再生終了」ってメッセージを受信した時に、ファイルを再び再生したらいいですね。
Win32 Appをクリエイトしてね!
#include <dshow.h>
#include <windows.h>
#pragma comment (lib,"Ole32.lib")
#pragma comment (lib,"Strmiids.lib")
#define ture (bool)-1
#define FILENAME L"C:\\Documents and Settings\\vs6\\桌面\\temp\\FL5007822001-500-2.avi"
#define WM_GRAPH_NOTIFY (WM_APP + 1) //g_pMediaEventExのメッセージ
bool g_bExit=false; //g_bExit=TUREのとき,アップ終了
HWND g_hwnd=0; //プレーヤーのメイン ウィンドウ
IMediaEventEx *g_pMediaEventEx; //もってdirectshowからメッセージ受信できる、メディア再生の終わる時に知らせてくれます:
IMediaControl *g_pMediaControl; //フィルタを繋げてくれまして、つまり簡単にファイルを開いたり再生したりしてくれます
IMediaPosition *g_pMediaPosition; //これでメディアの再生ポジションをゲットしたりセットしたりできます
void OnGraphNotify(); //この関数でg_pMediaEventExから受信
LRESULT WINAPI WinProc(HWND hwnd,UINT msg,WPARAM wparam,LPARAM lparam);
int WINAPI WinMain(HINSTANCE hInst,HINSTANCE hPrevInst,LPSTR CmdLine,int nShowCmd)
{
IGraphBuilder *pGraphBuilder; //directshowのカーネル
IVideoWindow *pVideoWindow; //これでdirectshowのビデオのウィンドウを制御
//COM初期化:
CoInitialize(NULL);
//FilterGraphをつくる:
CoCreateInstance(CLSID_FilterGraph,NULL,CLSCTX_INPROC,IID_IGraphBuilder,
(LPVOID*)&pGraphBuilder);
//directshowにMediaControlいんたーふぇーすを尋ねる:
pGraphBuilder->QueryInterface(IID_IMediaControl,(LPVOID*)&g_pMediaControl);
//directshowにMediaPositionインターフェースを尋ねる:
pGraphBuilder->QueryInterface(IID_IMediaPosition,(LPVOID*)&g_pMediaPosition);
//directshowにMediaEventsExインターフェースを尋ねる:
pGraphBuilder->QueryInterface(IID_IMediaEventEx,(LPVOID*)&g_pMediaEventEx);
//次のコードは、プレーヤーのウィンドウを一つ作って表示してくる役です:
WNDCLASSEX wc={sizeof(WNDCLASSEX),CS_CLASSDC,WinProc,0L,0L,
GetModuleHandle(0),0,0,0,0,"instemast",0};
RegisterClassEx(&wc);
//自前ウインドウの所望のクライアント座標:
RECT rect={100,100,640+100-1,480+100-1};//width=right-left+1 , right=left+width-1
//所望のクライアント座標によって実際の座標を計算:
::AdjustWindowRect(&rect,WS_OVERLAPPEDWINDOW,false);
//いまrectの値が更新されたのに注意してね!
g_hwnd=CreateWindow("instemast","dshow",WS_OVERLAPPEDWINDOW,rect.left,rect.top,
rect.right-rect.left,rect.bottom-rect.top,0,0,wc.hInstance,0);
::ShowWindow(g_hwnd,nShowCmd);
//メイン プレーヤー ウインドウ作りの終了
//g_hwndでdirectshowからメッセージを受信:
g_pMediaEventEx->SetNotifyWindow((OAHWND)g_hwnd,WM_GRAPH_NOTIFY, NULL);
//Graphをつくる:
g_pMediaControl->RenderFile(FILENAME);
//directshowに VideoWindow いんたーふぇーすを尋ねる:
pGraphBuilder->QueryInterface(IID_IVideoWindow,(LPVOID*)&pVideoWindow);
pVideoWindow->put_Owner((OAHWND)g_hwnd); //ビデオのウィンドウはg_hwndの子供ウィンドウです!
pVideoWindow->put_WindowStyle(WS_CHILD|WS_CLIPSIBLINGS);
pVideoWindow->SetWindowPosition(0,0,rect.right-rect.left+1,rect.bottom-rect.top+1);
pVideoWindow->put_Visible(OATRUE);
//再生開始:
g_pMediaControl->Run();
MSG msg;
do
{
GetMessage(&msg,0,0,0);
::TranslateMessage(&msg);
::DispatchMessage(&msg);
if(msg.message==WM_GRAPH_NOTIFY)OnGraphNotify();
}while(!g_bExit); //メッセージループ、g_bExit=TUREまで
//リソースの解放:
g_pMediaEventEx->Release();
pVideoWindow->Release();
g_pMediaControl->Release();
pGraphBuilder->Release();
//COM 解放:
CoUninitialize();
return 0;
}
void OnGraphNotify()
{
long evCode;
LONG param1, param2;
while(SUCCEEDED(g_pMediaEventEx->GetEvent(&evCode,¶m1, ¶m2, 0)))
{
g_pMediaEventEx->FreeEventParams(evCode, param1, param2);
switch (evCode)
{
case EC_COMPLETE: //我们的媒体播放结束了
g_pMediaPosition->put_CurrentPosition(0); //重设播放位置为0,就是倒回的意思
g_pMediaControl->Run();//重新播放
//以上这样,就是循环播放!
break;
};
};
}
LRESULT WINAPI WinProc(HWND hwnd,UINT msg,WPARAM wparam,LPARAM lparam)
{
switch(msg)
{
case WM_DESTROY:
g_pMediaControl->Stop(); //停止播放
g_bExit=ture; //我们的g_hwnd被关闭了,所以我们想退出程序
break;
};
return DefWindowProc(hwnd,msg,wparam,lparam);
}
ループ再生するよう、「再生終了」ってメッセージを受信した時に、ファイルを再び再生したらいいですね。
Win32 Appをクリエイトしてね!
#include <dshow.h>
#include <windows.h>
#pragma comment (lib,"Ole32.lib")
#pragma comment (lib,"Strmiids.lib")
#define ture (bool)-1
#define FILENAME L"C:\\Documents and Settings\\vs6\\桌面\\temp\\FL5007822001-500-2.avi"
#define WM_GRAPH_NOTIFY (WM_APP + 1) //g_pMediaEventExのメッセージ
bool g_bExit=false; //g_bExit=TUREのとき,アップ終了
HWND g_hwnd=0; //プレーヤーのメイン ウィンドウ
IMediaEventEx *g_pMediaEventEx; //もってdirectshowからメッセージ受信できる、メディア再生の終わる時に知らせてくれます:
IMediaControl *g_pMediaControl; //フィルタを繋げてくれまして、つまり簡単にファイルを開いたり再生したりしてくれます
IMediaPosition *g_pMediaPosition; //これでメディアの再生ポジションをゲットしたりセットしたりできます
void OnGraphNotify(); //この関数でg_pMediaEventExから受信
LRESULT WINAPI WinProc(HWND hwnd,UINT msg,WPARAM wparam,LPARAM lparam);
int WINAPI WinMain(HINSTANCE hInst,HINSTANCE hPrevInst,LPSTR CmdLine,int nShowCmd)
{
IGraphBuilder *pGraphBuilder; //directshowのカーネル
IVideoWindow *pVideoWindow; //これでdirectshowのビデオのウィンドウを制御
//COM初期化:
CoInitialize(NULL);
//FilterGraphをつくる:
CoCreateInstance(CLSID_FilterGraph,NULL,CLSCTX_INPROC,IID_IGraphBuilder,
(LPVOID*)&pGraphBuilder);
//directshowにMediaControlいんたーふぇーすを尋ねる:
pGraphBuilder->QueryInterface(IID_IMediaControl,(LPVOID*)&g_pMediaControl);
//directshowにMediaPositionインターフェースを尋ねる:
pGraphBuilder->QueryInterface(IID_IMediaPosition,(LPVOID*)&g_pMediaPosition);
//directshowにMediaEventsExインターフェースを尋ねる:
pGraphBuilder->QueryInterface(IID_IMediaEventEx,(LPVOID*)&g_pMediaEventEx);
//次のコードは、プレーヤーのウィンドウを一つ作って表示してくる役です:
WNDCLASSEX wc={sizeof(WNDCLASSEX),CS_CLASSDC,WinProc,0L,0L,
GetModuleHandle(0),0,0,0,0,"instemast",0};
RegisterClassEx(&wc);
//自前ウインドウの所望のクライアント座標:
RECT rect={100,100,640+100-1,480+100-1};//width=right-left+1 , right=left+width-1
//所望のクライアント座標によって実際の座標を計算:
::AdjustWindowRect(&rect,WS_OVERLAPPEDWINDOW,false);
//いまrectの値が更新されたのに注意してね!
g_hwnd=CreateWindow("instemast","dshow",WS_OVERLAPPEDWINDOW,rect.left,rect.top,
rect.right-rect.left,rect.bottom-rect.top,0,0,wc.hInstance,0);
::ShowWindow(g_hwnd,nShowCmd);
//メイン プレーヤー ウインドウ作りの終了
//g_hwndでdirectshowからメッセージを受信:
g_pMediaEventEx->SetNotifyWindow((OAHWND)g_hwnd,WM_GRAPH_NOTIFY, NULL);
//Graphをつくる:
g_pMediaControl->RenderFile(FILENAME);
//directshowに VideoWindow いんたーふぇーすを尋ねる:
pGraphBuilder->QueryInterface(IID_IVideoWindow,(LPVOID*)&pVideoWindow);
pVideoWindow->put_Owner((OAHWND)g_hwnd); //ビデオのウィンドウはg_hwndの子供ウィンドウです!
pVideoWindow->put_WindowStyle(WS_CHILD|WS_CLIPSIBLINGS);
pVideoWindow->SetWindowPosition(0,0,rect.right-rect.left+1,rect.bottom-rect.top+1);
pVideoWindow->put_Visible(OATRUE);
//再生開始:
g_pMediaControl->Run();
MSG msg;
do
{
GetMessage(&msg,0,0,0);
::TranslateMessage(&msg);
::DispatchMessage(&msg);
if(msg.message==WM_GRAPH_NOTIFY)OnGraphNotify();
}while(!g_bExit); //メッセージループ、g_bExit=TUREまで
//リソースの解放:
g_pMediaEventEx->Release();
pVideoWindow->Release();
g_pMediaControl->Release();
pGraphBuilder->Release();
//COM 解放:
CoUninitialize();
return 0;
}
void OnGraphNotify()
{
long evCode;
LONG param1, param2;
while(SUCCEEDED(g_pMediaEventEx->GetEvent(&evCode,¶m1, ¶m2, 0)))
{
g_pMediaEventEx->FreeEventParams(evCode, param1, param2);
switch (evCode)
{
case EC_COMPLETE: //我们的媒体播放结束了
g_pMediaPosition->put_CurrentPosition(0); //重设播放位置为0,就是倒回的意思
g_pMediaControl->Run();//重新播放
//以上这样,就是循环播放!
break;
};
};
}
LRESULT WINAPI WinProc(HWND hwnd,UINT msg,WPARAM wparam,LPARAM lparam)
{
switch(msg)
{
case WM_DESTROY:
g_pMediaControl->Stop(); //停止播放
g_bExit=ture; //我们的g_hwnd被关闭了,所以我们想退出程序
break;
};
return DefWindowProc(hwnd,msg,wparam,lparam);
}
#include <dshow.h>
#pragma comment (lib,"Ole32.lib")
#pragma comment (lib,"Strmiids.lib")
#define FILENAME L"C:\\Documents and Settings\\vs6\\桌面\\temp\\FL5007822001-500-2.avi"
bool g_bExit=false; //g_bExit=TUREのとき、このアップは終了
#define ture (bool)-1
int main()
{
IGraphBuilder *pGraphBuilder; //こりゃdirectshowのカーネル
IMediaControl *pMediaControl; //フィルタ(メディアファイル、デコーダーなど)を繋げてくれます
//つまり簡単にファイルを開いて再生したりしてくれます
IVideoWindow *pVideoWindow; //此を用いてdirectshowのビデオのウィンドウを 制御できます
//COMの初期化
CoInitialize(NULL);
//FilterGraphを作る
CoCreateInstance(CLSID_FilterGraph,NULL,CLSCTX_INPROC,IID_IGraphBuilder,
(LPVOID*)&pGraphBuilder);
// directshowにMediaControlインターフェースを尋ねる:
pGraphBuilder->QueryInterface(IID_IMediaControl,(LPVOID*)&pMediaControl);
//Graphをつくります:
pMediaControl->RenderFile(FILENAME);
//directshowにVideoWindowインターフェースを尋ねる:
pGraphBuilder->QueryInterface(IID_IVideoWindow,(LPVOID*)&pVideoWindow);
// フルスクリーン:
pVideoWindow->put_Visible(OATRUE);
pVideoWindow->put_FullScreenMode(OATRUE);
//再生起動:
pMediaControl->Run();
//終わるまで待つから:
MessageBox(NULL,"Block Execution","Block",MB_OK);
//再生停止:
pMediaControl->Stop();
// release resource:
pVideoWindow->Release();
pMediaControl->Release();
pGraphBuilder->Release();
// COM 解放:
CoUninitialize();
return 0;
}