再生時間を取得する

映像プレイヤーを書いていると、コンテンツがどれぐらいの時間で再生終了するのかを知りたくなると思います。 ここでは、コンテンツの再生時間を取得する方法を説明したいと思います。 (注意)ここの例では、サンプルを簡潔にするためにエラー処理を書いていません。

とりあえず、コードを書いてみる

まず、何も考えずに以下のコードを書いてみましょう。 「C:\DXSDK\Samples\media\water.mpg」というMPEGファイルの再生時間を表示して終了します。


#include <stdio.h>

#include <dshow.h>

#define	FILENAME L"c:\\DXSDK\\Samples\\Media\\butterfly.mpg"

int
main()
{
 IGraphBuilder *pGraphBuilder;
 IMediaControl *pMediaControl;
 IMediaPosition *pMediaPosition;

 REFTIME length;

 CoInitialize(NULL);

 CoCreateInstance(CLSID_FilterGraph,
	NULL,
	CLSCTX_INPROC,
	IID_IGraphBuilder,
	(LPVOID *)&pGraphBuilder);

 pGraphBuilder->QueryInterface(IID_IMediaControl,
	(LPVOID *)&pMediaControl);

 pGraphBuilder->QueryInterface(IID_IMediaPosition,
	(LPVOID *)&pMediaPosition);

 pMediaControl->RenderFile(FILENAME);

 pMediaPosition->get_Duration(&length);
 printf("%lf\n", length);

 pMediaPosition->Release();
 pMediaControl->Release();
 pGraphBuilder->Release();

 CoUninitialize();

 return 0;
}

IMediaPositionのget_Durationメソッドは、REFTIMEという値で再生時間を返します。 REFTIMEは、コンテンツ全体の再生時間を秒単位で表したものです。 REFTIMEは、以下のように宣言されており、実体はdoubleです。


typedef double REFTIME;