DVDの情報を取得する

DVDの再生を行うときに、DVD内のコンテンツに関する情報が欲しくなる事があります。 ここでは、DVDに含まれるタイトル数などを取得する方法を説明したいと思います。 (注意)ここの例では、サンプルを簡潔にするためにエラー処理を書いていません。

DVD情報取得サンプル

まず、何も考えずに以下のコードを書いてみましょう。 このコードは、DVDドライブに入っているDVDに関する情報を取得します。 DVDがドライブに入っていない場合には動作しません。

私の環境では何故かVisual Studioから起動すると動作しませんでした。 もし、動かない場合にはコマンドプロンプトから実行してみてください。


#include <stdio.h>
#include <dshow.h>

int
main()
{
 IDvdGraphBuilder *pDvdGraphBuilder;
 IDvdInfo2 *pDvdInfo2;

 CoInitialize(NULL);

 CoCreateInstance(CLSID_DvdGraphBuilder,
	NULL,
	CLSCTX_INPROC_SERVER,
	IID_IDvdGraphBuilder,
	(LPVOID *)&pDvdGraphBuilder);

 AM_DVD_RENDERSTATUS stat;
 pDvdGraphBuilder->RenderDvdVideoVolume(NULL,
     AM_DVD_HWDEC_PREFER, &stat);

 pDvdGraphBuilder->GetDvdInterface(IID_IDvdInfo2,
     (LPVOID *)&pDvdInfo2);

 ULONG numVolumes;
 ULONG curVolume;
 DVD_DISC_SIDE discSide;
 ULONG numTitles;
 pDvdInfo2->GetDVDVolumeInfo(&numVolumes,
     &curVolume, &discSide, &numTitles);

 printf("number of volumes : %u\n", numVolumes);
 printf("current volume : %u\n", curVolume);
 switch (discSide) {
	 case DVD_SIDE_A:
		 printf("DVD side A\n");
		 break;
	 case DVD_SIDE_B:
		 printf("DVD side B\n");
		 break;
 }
 printf("number of titles : %u\n", numTitles);

 pDvdInfo2->Release();
 pDvdGraphBuilder->Release();

 CoUninitialize();

 return 0;
}

GetDVDVolumeInfoの一つ目の引数は、全体のVolume数を表します。 ここで言うVolumeとは「巻」の事らしいです。

二つ目の引数は、現在再生しようとしているDVDのVolume番号を表します。

三つ目の引数は、現在の状態がDVDのA面かB面かを表します。

個人的には四つ目の引数が一番使うと思います。 四つ目の引数はDVDの総タイトル数を表します。 このタイトル番号を使って再生開始位置を設定出来たりするので、全部で何タイトルあるか知る事は重要だと思います。