再生終了時間の取得

「再生終了時間の取得」の編集履歴(バックアップ)一覧はこちら

再生終了時間の取得」(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 &lt;windows.h&gt;<br /> #include &lt;string&gt;<br /> #include &lt;dshow.h&gt;</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 *)&amp;pGB);</span></p> <p><span style="font-size:small;"> //MediaControlインターフェース取得<br />  pGB-&gt;QueryInterface(IID_IMediaControl,<br />  (LPVOID *)&amp;pMC);</span></p> <p><span style="font-size:small;"> //Graphを生成<br />  pMC-&gt;RenderFile(FileName);</span></p> <p><span style="font-size:small;"> //再生開始<br />  pMC-&gt;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-&gt;Run();<br />     return 0;<br />    }<br />    if( wp == VK_SPACE ){//一時停止<br />     pMC-&gt;Pause();<br />     return 0;<br />    }<br />    break;<br />   //終了処理<br />   case WM_DESTROY:<br />    //資源を解放<br />    pMC-&gt;Release();<br />    pGB-&gt;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-&gt;QueryInterface(IID_IMediaSeeking,(LPVOID *)&amp;pMSeek);<br />   pMSeek-&gt;GetCurrentPosition((LONGLONG *)&amp;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-&gt;GetDuration((LONGLONG *)&amp;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(&amp;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 , &amp;dwID);<br />  while (GetMessage(&amp;msg , NULL , 0 , 0)) DispatchMessage(&amp;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&amp;act=open&amp;pageid=72&amp;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 &lt;windows.h&gt;<br /> #include &lt;string&gt;<br /> #include &lt;dshow.h&gt;</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 *)&amp;pGB);</span></p> <p><span style="font-size:small;"> //MediaControlインターフェース取得<br />  pGB-&gt;QueryInterface(IID_IMediaControl,<br />  (LPVOID *)&amp;pMC);</span></p> <p><span style="font-size:small;"> //Graphを生成<br />  pMC-&gt;RenderFile(FileName);</span></p> <p><span style="font-size:small;"> //再生開始<br />  pMC-&gt;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-&gt;Run();<br />     return 0;<br />    }<br />    if( wp == VK_SPACE ){//一時停止<br />     pMC-&gt;Pause();<br />     return 0;<br />    }<br />    break;<br />   //終了処理<br />   case WM_DESTROY:<br />    //資源を解放<br />    pMC-&gt;Release();<br />    pGB-&gt;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-&gt;QueryInterface(IID_IMediaSeeking,(LPVOID *)&amp;pMSeek);<br />   pMSeek-&gt;GetCurrentPosition((LONGLONG *)&amp;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-&gt;GetDuration((LONGLONG *)&amp;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(&amp;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 , &amp;dwID);<br />  while (GetMessage(&amp;msg , NULL , 0 , 0)) DispatchMessage(&amp;msg);<br />  return msg.wParam;<br /> }</span></p> </td> </tr></tbody></table><p> </p>

表示オプション

横に並べて表示:
変化行の前後のみ表示: