Microsoft DirectX 8.0

IMediaDet インターフェイス

メディア ファイルに関して、ストリームの数、タイプ、時間幅、各ストリームのフレーム レートなどの情報を取得する。このインターフェイスには、ビデオ ストリームからポスター フレームを取得するメソッドも含まれている。メディア ディテクタは、このインターフェイスを公開する。このインターフェイスは、Microsoft® DirectShow® 編集サービス (DES) で使用する。

ファイルに関する情報を取得するには、以下の手順を実行する。

  1. CoCreateInstance を呼び出すことにより、メディア ディテクタのインスタンスを作成する。クラス ID は CLSID_MediaDet である。
  2. put_Filename を呼び出して、ソース ファイルの名前を指定する (別の方法として、put_Filter を呼び出す)。
  3. get_OutputStreams を呼び出して、ソース内の出力ストリームの個数を取得する。
  4. put_CurrentStream を呼び出して、特定のストリームを指定する。
  5. 次の任意のメソッドを呼び出す。get_StreamTypeget_StreamMediaTypeget_StreamLength、または get_FrameRate

ポスター フレームを取り出すには、GetBitmapBits または WriteBitmapBits を呼び出す。別の方法として、EnterBitmapGrabMode を呼び出した後、GetSampleGrabber を呼び出して ISampleGrabber インターフェイスへのポインタを取得する。これらの 3 つのメソッドはすべて、メディア ディテクタをビットマップ グラブ モードという新しいモードに設定する。前述の情報取得メソッドは、このモードでは動作しない。そのため、情報の取得はポスター フレームの取得の前に行う必要がある。そうでない場合は、ストリームごとにメディア ディテクタの新しいインスタンスを作成することになる。

要件

Qedit.h が必要である。

vtable 順のメソッド

IUnknown メソッド説明
QueryInterfaceサポートされているインターフェイスへのポインタを取得する。
AddRef参照カウントをインクリメントする。
Release参照カウントをデクリメントする。
IMediaDet インターフェイス説明
get_Filterメディア ディテクタが現在使用しているソース フィルタへのポインタを取得する。
put_Filterメディア ディテクタで使用するソース フィルタを指定する。
get_OutputStreamsメディア ソースに含まれる出力ストリームの個数を取得する。
get_CurrentStreamメディア ディテクタが現在使用しているストリーム番号を取得する。
put_CurrentStreamメディア ディテクタで使用するストリーム番号を指定する。
get_StreamType現在のストリームのメディア タイプのグローバル ユニーク識別子 (GUID) を取得する。
get_StreamTypeB現在のストリームのメディア タイプの GUID を表す文字列を取得する。
get_StreamLength現在のストリームの時間幅を取得する。
get_Filenameメディア ディテクタが現在使用しているソース ファイルの名前を取得する。
put_Filenameメディア ディテクタで使用するソース ファイルの名前を指定する。
GetBitmapBits指定されたメディア タイムのポスター フレームを取得する。
WriteBitmapBits指定されたメディア タイムのポスター フレームを取得し、それをファイルに書き込む。
get_StreamMediaType現在のストリームのメディア タイプを取得する。
GetSampleGrabberISampleGrabber インターフェイスへのポインタを取得する。
get_FrameRate現在のストリームのフレーム レートを取得する。
EnterBitmapGrabModeメディア ディテクタをビットマップ グラブ モードに切り替え、フィルタ グラフの指定の時間をシークする。

IMediaDet::EnterBitmapGrabMode

IMediaDet インターフェイス

メディア ディテクタをビットマップ グラブ モードに切り替え、フィルタ グラフの指定の時間をシークする。

構文

HRESULT EnterBitmapGrabMode(
    double StreamTime
);

パラメータ

StreamTime
グラフをシークする時間 (秒単位)。

戻り値

HRESULT 値を返す。可能な値は次のとおりである。

S_OK成功。
E_INVALIDARG無効な引数。
VFW_E_INVALIDMEDIATYPEファイルはビデオ ストリームを持っていない。
VFW_E_TIME_EXPIREDシークできなかった。

注意

このメソッドを呼び出す前に、put_Filename および put_CurrentStream を呼び出してファイル名とストリームを設定する。

このメソッドは、サンプル グラバ フィルタをフィルタ グラフに挿入する。それにより、GetSampleGrabber を呼び出して ISampleGrabber インターフェイスへのポインタを取得できる。メディア ディテクタがビットマップ グラブ モードに入ってからは、IMediaDet の各種の情報取得メソッドは機能しない。

GetBitmapBits および WriteBitmapBits メソッドも、メディア ディテクタをビットマップ グラブ モードに設定する。

IMediaDet::GetBitmapBits

IMediaDet インターフェイス

指定されたメディア タイムのポスター フレームを取得する。

構文

HRESULT GetBitmapBits(
    double StreamTime, 
    long *pBufferSize, 
    char *pBuffer, 
    long Width, 
    long Height
);

パラメータ

StreamTime
ポスター フレームを取得する時間。
pBufferSize
必要なバッファ サイズを受け取る変数へのポインタ。pBuffer が NULL の場合、この変数はポスター フレームの取得に必要なバッファのサイズを受け取る。pBuffer が NULL でない場合、このパラメータは無視される。
pBuffer
ポスター フレームを受け取るバッファへのポインタ。
Width
ポスター フレーム イメージの幅 (ピクセル単位)。
Height
ポスター フレーム イメージの高さ (ピクセル単位)。

戻り値

HRESULT 値を返す。可能な値は次のとおりである。

S_OK成功。
E_NOINTERFACEサンプル グラバ フィルタをグラフに追加できなかった。
E_OUTOFMEMORYメモリ不足。
E_POINTERNULL ポインタ エラー。
E_UNEXPECTED予期せぬエラー。
VFW_E_INVALIDMEDIATYPE無効なメディア タイプ。

注意

このメソッドを呼び出す前に、put_Filename および put_CurrentStream を呼び出してファイル名とストリームを設定する。

必要なバッファのサイズを決定するには、pBuffer を NULL にしてこのメソッドを呼び出す。サイズは、pBufferSize が指す変数に返される。そして、バッファを作成して、再度このメソッドを呼び出す。その例を次のコードに示す。

long BufferSize = 0;
GetBitmapBits(StreamTime, &BufferSize, NULL, Width, Height);
char *pBuffer = new char[BufferSize];
GetBitmapBits(StreamTime, 0, pBuffer, Width, Height);

このメソッドは、メディア ディテクタをビットマップ グラブ モードに設定する。このメソッドが呼び出された後は、メディア ディテクタの新しいインスタンスを作成しなければ、IMediaDet の各種のストリーム情報取得メソッドは機能しない。

IMediaDet::get_CurrentStream

IMediaDet インターフェイス

メディア ディテクタが現在使用しているストリーム番号を取得する。

構文

HRESULT get_CurrentStream(
    long *pVal
);

パラメータ

pVal
[out, retval] 現在のストリーム番号を受け取る変数へのポインタ。

戻り値

成功した場合は、S_OK を返す。それ以外の場合は、E_POINTER を返す。

IMediaDet::get_Filename

IMediaDet インターフェイス

メディア ディテクタが現在使用しているソース ファイルの名前を取得する。

構文

HRESULT get_Filename(
    BSTR *pVal
);

パラメータ

pVal
[out, retval] ファイル名を受け取る変数へのポインタ。

戻り値

成功した場合は、S_OK を返す。それ以外の場合は、エラーの発生を示す HRESULT 値を返す。

注意

このメソッドは、文字列に必要なメモリを割り当てる。アプリケーションは SysFreeString を呼び出して、メモリを解放しなければならない。

IMediaDet::get_Filter

IMediaDet インターフェイス

メディア ディテクタが現在使用しているソース フィルタへのポインタを取得する。

構文

HRESULT get_Filter(
    IUnknown **ppVal
);

パラメータ

ppVal
[out, retval] フィルタの IUnknown インターフェイスを受け取るポインタのアドレス。使用されているソース フィルタがない場合、値は NULL に設定される。

戻り値

HRESULT 値を返す。

注意

メソッドが復帰したときに *ppVal が NULL 以外の場合、IUnknown インターフェイスは未処理の参照カウントを持つ。使い終わった場合は、インターフェイスを必ず解放すること。

IMediaDet::get_FrameRate

IMediaDet インターフェイス

現在のストリームのフレーム レートを取得する。このストリームは、ビデオ ストリームでなければならない。

構文

HRESULT get_FrameRate(
    double *pVal
);

パラメータ

pVal
[out, retval] フレーム レート (毎秒のフレーム数) を受け取る変数へのポインタ。

戻り値

HRESULT 値を返す。可能な値は次のとおりである。

S_FALSEビデオ フォーマット ヘッダーでフレーム レートが指定されていない。
S_OK成功。
E_INVALIDARG無効な引数。
E_POINTERNULL ポインタ引数。
VFW_E_INVALIDMEDIATYPE無効なメディア タイプ。

注意

このメソッドは、ASF ファイルからはフレーム レートを取得できない。

このメソッドを呼び出す前に、put_Filename および put_CurrentStream を呼び出してファイル名とストリームを設定する。

メディア ディテクタがビットマップ グラブ モードの場合、このメソッドは E_INVALIDARG を返す。詳細については、「EnterBitmapGrabMode」を参照すること。

IMediaDet::get_OutputStreams

IMediaDet インターフェイス

メディア ソースに含まれる出力ストリームの個数を取得する。

構文

HRESULT get_OutputStreams(
    long *pVal
);

パラメータ

pVal
[out, retval] 出力ストリームの個数を受け取る変数へのポインタ。

戻り値

次のいずれかの HRESULT 値を返す。

S_OK成功。
E_INVALIDARG無効な引数。
E_POINTERNULL ポインタ引数。

注意

このメソッドを呼び出す前に、put_Filename を呼び出してファイル名を設定する。

メディア ディテクタがビットマップ グラブ モードの場合、このメソッドは E_INVALIDARG を返す。詳細については、「EnterBitmapGrabMode」を参照すること。

IMediaDet::GetSampleGrabber

IMediaDet インターフェイス

ISampleGrabber インターフェイスへのポインタを取得する。このインターフェイスにより、アプリケーションでメディア ストリームから個々のサンプルを取得できる。

構文

HRESULT GetSampleGrabber( 
    ISampleGrabber **ppVal 
);

パラメータ

ppVal
[out] ISampleGrabber インターフェイスを受け取るポインタのアドレス。

戻り値

次のいずれかの HRESULT 値を返す。

S_OK成功。
E_NOINTERFACEメディア ディテクタがビットマップ グラブ モードであるため、インターフェイスを取得できない。
E_POINTERNULL ポインタ引数。

注意

このメソッドを呼び出す前に、EnterBitmapGrabMode を呼び出す。ISampleGrabber インターフェイスによって、ストリームから個々のメディア サンプルを取得することができる。ポスター フレーム用のビットマップが必要なだけの場合は、代わりに IMediaDet::GetBitmapBits メソッドを呼び出す。ISampleGrabber インターフェイスの方が柔軟性はあるが、アプリケーション側で必要な処理も多くなる。

このメソッドが成功した場合、返される ISampleGrabber インターフェイスは未処理の参照カウントを持つ。使い終わった場合は、インターフェイスを必ず解放すること。

IMediaDet::get_StreamLength

IMediaDet インターフェイス

現在のストリームの時間幅を取得する。

構文

HRESULT get_StreamLength(
    double *pVal
);

パラメータ

pVal
[out, retval] ストリームの時間幅 (秒単位) を受け取る変数へのポインタ。

戻り値

HRESULT 値を返す。可能な値は次のとおりである。

S_OK成功。
E_INVALIDARG無効な引数。
E_POINTERNULL ポインタ引数。

注意

このメソッドを呼び出す前に、put_Filename および put_CurrentStream を呼び出してファイル名とストリームを設定する。

メディア ディテクタがビットマップ グラブ モードの場合、このメソッドは E_INVALIDARG を返す。詳細については、「EnterBitmapGrabMode」を参照すること。

IMediaDet::get_StreamMediaType

IMediaDet インターフェイス

現在のストリームのメディア タイプを取得する。

構文

HRESULT get_StreamMediaType(
    AM_MEDIA_TYPE *pVal
);

パラメータ

pVal
[out, retval] このメディア タイプが設定されている AM_MEDIA_TYPE 構造体へのポインタ。

戻り値

HRESULT 値を返す。可能な値は次のとおりである。

S_OK成功。
E_INVALIDARG無効な引数。
E_POINTERNULL ポインタ引数。

注意

このメソッドを呼び出す前に、put_Filename および put_CurrentStream を呼び出してファイル名とストリームを設定する。

メディア ディテクタがビットマップ グラブ モードの場合、このメソッドは E_INVALIDARG を返す。詳細については、「EnterBitmapGrabMode」を参照すること。

IMediaDet::get_StreamType

IMediaDet インターフェイス

現在のストリームのメディア タイプのグローバル ユニーク識別子 (GUID) を取得する。

構文

HRESULT get_StreamType(
    GUID *pVal
);

パラメータ

pVal
[out, retval] メディア タイプのメジャー タイプ GUID を受け取る変数へのポインタ。

戻り値

HRESULT 値を返す。可能な値は次のとおりである。

S_OK成功。
E_INVALIDARG無効な引数。
E_POINTERNULL ポインタ引数。

注意

このメソッドは、AM_MEDIA_TYPE 構造体の majortype メンバを取得する。AM_MEDIA_TYPE 構造体はストリームのフォーマットを記述し、majortype メンバはオーディオやビデオなどの汎用カテゴリを示す GUID である。ビデオ ストリームの場合、GUID は MEDIATYPE_Video である。オーディオの場合は、MEDIATYPE_Audio である。AM_MEDIA_TYPE 構造体全体を取得するには、get_StreamMediaType メソッドを呼び出す。

このメソッドを呼び出す前に、put_Filename および put_CurrentStream を呼び出してファイル名とストリームを設定する。

メディア ディテクタがビットマップ グラブ モードの場合、このメソッドは E_INVALIDARG を返す。詳細については、「EnterBitmapGrabMode」を参照すること。

IMediaDet::get_StreamTypeB

IMediaDet インターフェイス

現在のストリームのメディア タイプの GUID を表す文字列を取得する。

構文

HRESULT get_StreamTypeB(
    BSTR *pVal
);

パラメータ

pVal
[out, retval] メディア タイプ GUID の文字列表現を受け取る BSTR へのポインタ。

戻り値

HRESULT 値を返す。可能な値は次のとおりである。

S_OK成功。
E_INVALIDARG無効な引数。
E_POINTERNULL ポインタ引数。

注意

返される BSTR は次のようなフォーマットである。{73647561-0000-0010-8000-00AA00389B71}

このメソッドは、文字列に必要なメモリを割り当てる。アプリケーションは SysFreeString を呼び出して、メモリを解放しなければならない。

このメソッドを呼び出す前に、put_Filename および put_CurrentStream を呼び出してファイル名とストリームを設定する。

メディア ディテクタがビットマップ グラブ モードの場合、このメソッドは E_INVALIDARG を返す。詳細については、「EnterBitmapGrabMode」を参照すること。

IMediaDet::put_CurrentStream

IMediaDet インターフェイス

メディア ディテクタで使用するストリーム番号を指定する。

構文

HRESULT put_CurrentStream(
    long newVal
);

パラメータ

newVal
[in] ストリーム番号。

戻り値

成功した場合は S_OK、それ以外の場合は E_INVALIDARG を返す。

注意

このメソッドを呼び出す前に、put_Filename を呼び出してファイル名を設定する。get_OutputStreams を呼び出して、ソース ファイルに含まれるストリームの個数を調べる。

メディア ディテクタがビットマップ グラブ モードの場合、このメソッドは E_INVALIDARG を返す。詳細については、「EnterBitmapGrabMode」を参照すること。

IMediaDet::put_Filename

IMediaDet インターフェイス

メディア ディテクタで使用するソース ファイルの名前を指定する。

構文

HRESULT put_Filename(
    BSTR newVal
);

パラメータ

newVal
[in] ソースのファイル名。

戻り値

成功した場合は、S_OK を返す。それ以外の場合は、エラーの発生を示す HRESULT 値を返す。

IMediaDet::put_Filter

IMediaDet インターフェイス

メディア ディテクタで使用するソース フィルタを指定する。

構文

HRESULT put_Filter(
    IUnknown *newVal
);

パラメータ

newVal
[in] ソース フィルタの IUnknown インターフェイスを指すポインタ。

戻り値

HRESULT 値を返す。可能な値は次のとおりである。

S_OK成功。
E_NOINTERFACEnewVal はフィルタを指していない。
E_POINTERNULL ポインタ引数。

注意

アプリケーションでは、put_Filename を呼び出す代わりに、ソース フィルタの IUnknown インターフェイスへのポインタを指定してこのメソッドを呼び出すことができる。 既にフィルタ グラフに接続されているフィルタを使用してはならない。

IMediaDet::WriteBitmapBits

IMediaDet インターフェイス

指定されたメディア タイムのポスター フレームを取得し、それをファイルに書き込む。

構文

HRESULT WriteBitmapBits(
    double StreamTime, 
    long Width, 
    long Height, 
    BSTR Filename 
);

パラメータ

StreamTime
ポスター フレームを取得する時間。
Width
ポスター フレーム イメージの幅 (ピクセル単位)。
Height
ポスター フレーム イメージの高さ (ピクセル単位)。
Filename
ポスター フレームを保存するファイルのパス。ファイルが既に存在する場合、このメソッドはそのファイルにオーバーライドする。

戻り値

成功した場合は、S_OK を返す。それ以外の場合は、エラーの発生を示す HRESULT 値を返す。可能なエラー コードは次のとおりである。

E_NOINTERFACEサンプル グラバ フィルタをグラフに追加できなかった。
E_FAIL失敗。
E_OUTOFMEMORYメモリ不足。
E_UNEXPECTED予期せぬエラー。
STG_E_ACCESSDENIEDファイルをオーバーライドできない。
VFW_E_INVALIDMEDIATYPE無効なメディア タイプ。

注意

このメソッドを呼び出す前に、put_Filename および put_CurrentStream を呼び出してファイル名とストリームを設定する。

このメソッドは、メディア ディテクタをビットマップ グラブ モードに設定する。このメソッドが呼び出された後は、メディア ディテクタの新しいインスタンスを作成しなければ、IMediaDet の各種のストリーム情報取得メソッドは機能しない。