「再生終了時間の取得」の編集履歴(バックアップ)一覧はこちら
「再生終了時間の取得」(2011/02/08 (火) 11:48:04) の最新版変更点
追加された行は緑色になります。
削除された行は赤色になります。
<p><strong>今回はメディアの再生終了時間を取得します。<br />
再生が終わる時間がわかればループ再生の処理なども可能になります。</strong></p>
<p> </p>
<table border="1" cellspacing="1" cellpadding="1" width="600"><tbody><tr><td>
<p><span style="font-size:small;">#pragma comment (lib,
"strmiids.lib")</span></p>
<p><span style="font-size:small;">#include <windows.h><br />
#include <string><br />
#include <dshow.h></span></p>
<p><span style="font-size:small;">using namespace std;</span></p>
<p><span style="font-size:small;">#define FileName TEXT("test.mid")</span></p>
<p><span style="font-size:small;">IGraphBuilder *pGB;<br />
IMediaControl *pMC;<br />
IMediaSeeking *pMSeek;<br />
long length,end;<br />
HWND hwnd;<br />
HDC hdc;<br />
wchar_t buf[256];<br />
wstring str;</span></p>
<p><span style="font-size:small;">//ミリ秒表示用<br />
wchar_t* L2A(long a)<br />
{<br />
_ltow_s(a/100000, buf,256, 10);<br />
return buf;<br />
}</span></p>
<p><span style="font-size:small;">void Init()<br />
{<br />
//COMを初期化<br />
CoInitialize(NULL);<br />
//FilterGraphを生成<br />
CoCreateInstance(CLSID_FilterGraph,NULL,CLSCTX_INPROC,<br />
IID_IGraphBuilder,(LPVOID *)&pGB);</span></p>
<p><span style="font-size:small;"> //MediaControlインターフェース取得<br />
pGB->QueryInterface(IID_IMediaControl,<br />
(LPVOID *)&pMC);</span></p>
<p><span style="font-size:small;"> //Graphを生成<br />
pMC->RenderFile(FileName);</span></p>
<p><span style="font-size:small;"> //再生開始<br />
pMC->Run();<br />
}<br />
//コールバック<br />
LRESULT CALLBACK WndProc(HWND hwnd , UINT msg , WPARAM wp , LPARAM lp)<br />
{<br />
switch (msg) {<br />
case WM_KEYDOWN: // キーが押されたとき<br />
if( wp == VK_RETURN ){//再生<br />
pMC->Run();<br />
return 0;<br />
}<br />
if( wp == VK_SPACE ){//一時停止<br />
pMC->Pause();<br />
return 0;<br />
}<br />
break;<br />
//終了処理<br />
case WM_DESTROY:<br />
//資源を解放<br />
pMC->Release();<br />
pGB->Release();</span></p>
<p><span style="font-size:small;"> //COM終了<br />
CoUninitialize();<br />
PostQuitMessage(0);<br />
return 0;<br />
}</span></p>
<p><span style="font-size:small;"> return DefWindowProc(hwnd , msg , wp ,
lp);<br />
}</span></p>
<p><span style="font-size:small;">DWORD WINAPI MainLoop(LPVOID vdParam)<br />
{<br />
hdc = GetDC(hwnd);<br />
while(TRUE){<br />
pGB->QueryInterface(IID_IMediaSeeking,(LPVOID *)&pMSeek);<br />
pMSeek->GetCurrentPosition((LONGLONG *)&length);//現在の再生時間を取得<br />
str=TEXT("現在の再生位置:");<br />
str+=L2A((long)length);<br />
str+=TEXT(" ");<br />
TextOut( hdc, 50, 90,str.c_str(),str.length());<br />
<br />
pMSeek->GetDuration((LONGLONG *)&end);<br />
str=TEXT("再生メディアの終了時間:");<br />
str+=L2A((long)end);<br />
str+=TEXT(" ");<br />
TextOut( hdc, 50, 70,str.c_str(),str.length());<br />
<br />
Sleep(16);<br />
}<br />
return 0;<br />
}<br />
//メイン<br />
int WINAPI WinMain(HINSTANCE hInst , HINSTANCE hPrevI , PSTR lpCmd , int
nCmdShow)<br />
{<br />
MSG msg;<br />
WNDCLASS winc;<br />
DWORD dwID;</span></p>
<p><span style="font-size:small;"> winc.style = CS_HREDRAW | CS_VREDRAW;<br />
winc.lpfnWndProc = WndProc;<br />
winc.cbClsExtra = winc.cbWndExtra = 0;<br />
winc.hInstance = hInst;<br />
winc.hIcon = LoadIcon(NULL , IDI_APPLICATION);<br />
winc.hCursor = LoadCursor(NULL , IDC_ARROW);<br />
winc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);<br />
winc.lpszMenuName = NULL;<br />
winc.lpszClassName = TEXT("window");</span></p>
<p><span style="font-size:small;"> if (!RegisterClass(&winc)) return
0;</span></p>
<p><span style="font-size:small;"> hwnd = CreateWindow(TEXT("window") ,
TEXT("Hellow DirectShow World!!") ,<br />
WS_OVERLAPPEDWINDOW | WS_VISIBLE ,<br />
100 , 100 , 320 , 240 , NULL , NULL ,hInst , NULL);</span></p>
<p><span style="font-size:small;"> if (hwnd == NULL) return 0;</span></p>
<p><span style="font-size:small;"> Init();<br />
CreateThread(NULL , 0 , MainLoop , (LPVOID)hwnd , 0 , &dwID);<br />
while (GetMessage(&msg , NULL , 0 , 0)) DispatchMessage(&msg);<br />
return msg.wParam;<br />
}</span></p>
</td>
</tr></tbody></table><p> </p>
<p><strong>今回はメディアの再生終了時間を取得します。<br />
再生が終わる時間がわかればループ再生の処理なども可能になります。</strong></p>
<p> <img alt="" src="http://www21.atwiki.jp/opengl?cmd=upload&act=open&pageid=72&file=end.png" /></p>
<table border="1" cellspacing="1" cellpadding="1" width="600"><tbody><tr><td>
<p><span style="font-size:small;">#pragma comment (lib,
"strmiids.lib")</span></p>
<p><span style="font-size:small;">#include <windows.h><br />
#include <string><br />
#include <dshow.h></span></p>
<p><span style="font-size:small;">using namespace std;</span></p>
<p><span style="font-size:small;">#define FileName TEXT("test.mid")</span></p>
<p><span style="font-size:small;">IGraphBuilder *pGB;<br />
IMediaControl *pMC;<br />
IMediaSeeking *pMSeek;<br />
long length,end;<br />
HWND hwnd;<br />
HDC hdc;<br />
wchar_t buf[256];<br />
wstring str;</span></p>
<p><span style="font-size:small;">//ミリ秒表示用<br />
wchar_t* L2A(long a)<br />
{<br />
_ltow_s(a/100000, buf,256, 10);<br />
return buf;<br />
}</span></p>
<p><span style="font-size:small;">void Init()<br />
{<br />
//COMを初期化<br />
CoInitialize(NULL);<br />
//FilterGraphを生成<br />
CoCreateInstance(CLSID_FilterGraph,NULL,CLSCTX_INPROC,<br />
IID_IGraphBuilder,(LPVOID *)&pGB);</span></p>
<p><span style="font-size:small;"> //MediaControlインターフェース取得<br />
pGB->QueryInterface(IID_IMediaControl,<br />
(LPVOID *)&pMC);</span></p>
<p><span style="font-size:small;"> //Graphを生成<br />
pMC->RenderFile(FileName);</span></p>
<p><span style="font-size:small;"> //再生開始<br />
pMC->Run();<br />
}<br />
//コールバック<br />
LRESULT CALLBACK WndProc(HWND hwnd , UINT msg , WPARAM wp , LPARAM lp)<br />
{<br />
switch (msg) {<br />
case WM_KEYDOWN: // キーが押されたとき<br />
if( wp == VK_RETURN ){//再生<br />
pMC->Run();<br />
return 0;<br />
}<br />
if( wp == VK_SPACE ){//一時停止<br />
pMC->Pause();<br />
return 0;<br />
}<br />
break;<br />
//終了処理<br />
case WM_DESTROY:<br />
//資源を解放<br />
pMC->Release();<br />
pGB->Release();</span></p>
<p><span style="font-size:small;"> //COM終了<br />
CoUninitialize();<br />
PostQuitMessage(0);<br />
return 0;<br />
}</span></p>
<p><span style="font-size:small;"> return DefWindowProc(hwnd , msg , wp ,
lp);<br />
}</span></p>
<p><span style="font-size:small;">DWORD WINAPI MainLoop(LPVOID vdParam)<br />
{<br />
hdc = GetDC(hwnd);<br />
while(TRUE){<br />
pGB->QueryInterface(IID_IMediaSeeking,(LPVOID *)&pMSeek);<br />
pMSeek->GetCurrentPosition((LONGLONG *)&length);//現在の再生時間を取得<br />
str=TEXT("現在の再生位置:");<br />
str+=L2A((long)length);<br />
str+=TEXT(" ");<br />
TextOut( hdc, 50, 90,str.c_str(),str.length());<br />
<br />
pMSeek->GetDuration((LONGLONG *)&end);<br />
str=TEXT("再生メディアの終了時間:");<br />
str+=L2A((long)end);<br />
str+=TEXT(" ");<br />
TextOut( hdc, 50, 70,str.c_str(),str.length());<br />
<br />
Sleep(16);<br />
}<br />
return 0;<br />
}<br />
//メイン<br />
int WINAPI WinMain(HINSTANCE hInst , HINSTANCE hPrevI , PSTR lpCmd , int
nCmdShow)<br />
{<br />
MSG msg;<br />
WNDCLASS winc;<br />
DWORD dwID;</span></p>
<p><span style="font-size:small;"> winc.style = CS_HREDRAW | CS_VREDRAW;<br />
winc.lpfnWndProc = WndProc;<br />
winc.cbClsExtra = winc.cbWndExtra = 0;<br />
winc.hInstance = hInst;<br />
winc.hIcon = LoadIcon(NULL , IDI_APPLICATION);<br />
winc.hCursor = LoadCursor(NULL , IDC_ARROW);<br />
winc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);<br />
winc.lpszMenuName = NULL;<br />
winc.lpszClassName = TEXT("window");</span></p>
<p><span style="font-size:small;"> if (!RegisterClass(&winc)) return
0;</span></p>
<p><span style="font-size:small;"> hwnd = CreateWindow(TEXT("window") ,
TEXT("Hellow DirectShow World!!") ,<br />
WS_OVERLAPPEDWINDOW | WS_VISIBLE ,<br />
100 , 100 , 320 , 240 , NULL , NULL ,hInst , NULL);</span></p>
<p><span style="font-size:small;"> if (hwnd == NULL) return 0;</span></p>
<p><span style="font-size:small;"> Init();<br />
CreateThread(NULL , 0 , MainLoop , (LPVOID)hwnd , 0 , &dwID);<br />
while (GetMessage(&msg , NULL , 0 , 0)) DispatchMessage(&msg);<br />
return msg.wParam;<br />
}</span></p>
</td>
</tr></tbody></table><p> </p>