Microsoft DirectX 8.0 |
メディア ファイルに関して、ストリームの数、タイプ、時間幅、各ストリームのフレーム レートなどの情報を取得する。このインターフェイスには、ビデオ ストリームからポスター フレームを取得するメソッドも含まれている。メディア ディテクタは、このインターフェイスを公開する。このインターフェイスは、Microsoft® DirectShow® 編集サービス (DES) で使用する。
ファイルに関する情報を取得するには、以下の手順を実行する。
ポスター フレームを取り出すには、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 現在のストリームのメディア タイプを取得する。 GetSampleGrabber ISampleGrabber インターフェイスへのポインタを取得する。 get_FrameRate 現在のストリームのフレーム レートを取得する。 EnterBitmapGrabMode メディア ディテクタをビットマップ グラブ モードに切り替え、フィルタ グラフの指定の時間をシークする。
メディア ディテクタをビットマップ グラブ モードに切り替え、フィルタ グラフの指定の時間をシークする。
構文
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 メソッドも、メディア ディテクタをビットマップ グラブ モードに設定する。
指定されたメディア タイムのポスター フレームを取得する。
構文
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_POINTER NULL ポインタ エラー。 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 の各種のストリーム情報取得メソッドは機能しない。
メディア ディテクタが現在使用しているストリーム番号を取得する。
構文
HRESULT get_CurrentStream( long *pVal );
パラメータ
- pVal
- [out, retval] 現在のストリーム番号を受け取る変数へのポインタ。
戻り値
成功した場合は、S_OK を返す。それ以外の場合は、E_POINTER を返す。
メディア ディテクタが現在使用しているソース ファイルの名前を取得する。
構文
HRESULT get_Filename( BSTR *pVal );
パラメータ
- pVal
- [out, retval] ファイル名を受け取る変数へのポインタ。
戻り値
成功した場合は、S_OK を返す。それ以外の場合は、エラーの発生を示す HRESULT 値を返す。
注意
このメソッドは、文字列に必要なメモリを割り当てる。アプリケーションは SysFreeString を呼び出して、メモリを解放しなければならない。
メディア ディテクタが現在使用しているソース フィルタへのポインタを取得する。
構文
HRESULT get_Filter( IUnknown **ppVal );
パラメータ
- ppVal
- [out, retval] フィルタの IUnknown インターフェイスを受け取るポインタのアドレス。使用されているソース フィルタがない場合、値は NULL に設定される。
戻り値
HRESULT 値を返す。
注意
メソッドが復帰したときに *ppVal が NULL 以外の場合、IUnknown インターフェイスは未処理の参照カウントを持つ。使い終わった場合は、インターフェイスを必ず解放すること。
現在のストリームのフレーム レートを取得する。このストリームは、ビデオ ストリームでなければならない。
構文
HRESULT get_FrameRate( double *pVal );
パラメータ
- pVal
- [out, retval] フレーム レート (毎秒のフレーム数) を受け取る変数へのポインタ。
戻り値
HRESULT 値を返す。可能な値は次のとおりである。
S_FALSE ビデオ フォーマット ヘッダーでフレーム レートが指定されていない。 S_OK 成功。 E_INVALIDARG 無効な引数。 E_POINTER NULL ポインタ引数。 VFW_E_INVALIDMEDIATYPE 無効なメディア タイプ。
注意
このメソッドは、ASF ファイルからはフレーム レートを取得できない。
このメソッドを呼び出す前に、put_Filename および put_CurrentStream を呼び出してファイル名とストリームを設定する。
メディア ディテクタがビットマップ グラブ モードの場合、このメソッドは E_INVALIDARG を返す。詳細については、「EnterBitmapGrabMode」を参照すること。
メディア ソースに含まれる出力ストリームの個数を取得する。
構文
HRESULT get_OutputStreams( long *pVal );
パラメータ
- pVal
- [out, retval] 出力ストリームの個数を受け取る変数へのポインタ。
戻り値
次のいずれかの HRESULT 値を返す。
S_OK 成功。 E_INVALIDARG 無効な引数。 E_POINTER NULL ポインタ引数。
注意
このメソッドを呼び出す前に、put_Filename を呼び出してファイル名を設定する。
メディア ディテクタがビットマップ グラブ モードの場合、このメソッドは E_INVALIDARG を返す。詳細については、「EnterBitmapGrabMode」を参照すること。
ISampleGrabber インターフェイスへのポインタを取得する。このインターフェイスにより、アプリケーションでメディア ストリームから個々のサンプルを取得できる。
構文
HRESULT GetSampleGrabber( ISampleGrabber **ppVal );
パラメータ
- ppVal
- [out] ISampleGrabber インターフェイスを受け取るポインタのアドレス。
戻り値
次のいずれかの HRESULT 値を返す。
S_OK 成功。 E_NOINTERFACE メディア ディテクタがビットマップ グラブ モードであるため、インターフェイスを取得できない。 E_POINTER NULL ポインタ引数。
注意
このメソッドを呼び出す前に、EnterBitmapGrabMode を呼び出す。ISampleGrabber インターフェイスによって、ストリームから個々のメディア サンプルを取得することができる。ポスター フレーム用のビットマップが必要なだけの場合は、代わりに IMediaDet::GetBitmapBits メソッドを呼び出す。ISampleGrabber インターフェイスの方が柔軟性はあるが、アプリケーション側で必要な処理も多くなる。
このメソッドが成功した場合、返される ISampleGrabber インターフェイスは未処理の参照カウントを持つ。使い終わった場合は、インターフェイスを必ず解放すること。
現在のストリームの時間幅を取得する。
構文
HRESULT get_StreamLength( double *pVal );
パラメータ
- pVal
- [out, retval] ストリームの時間幅 (秒単位) を受け取る変数へのポインタ。
戻り値
HRESULT 値を返す。可能な値は次のとおりである。
S_OK 成功。 E_INVALIDARG 無効な引数。 E_POINTER NULL ポインタ引数。
注意
このメソッドを呼び出す前に、put_Filename および put_CurrentStream を呼び出してファイル名とストリームを設定する。
メディア ディテクタがビットマップ グラブ モードの場合、このメソッドは E_INVALIDARG を返す。詳細については、「EnterBitmapGrabMode」を参照すること。
現在のストリームのメディア タイプを取得する。
構文
HRESULT get_StreamMediaType( AM_MEDIA_TYPE *pVal );
パラメータ
- pVal
- [out, retval] このメディア タイプが設定されている AM_MEDIA_TYPE 構造体へのポインタ。
戻り値
HRESULT 値を返す。可能な値は次のとおりである。
S_OK 成功。 E_INVALIDARG 無効な引数。 E_POINTER NULL ポインタ引数。
注意
このメソッドを呼び出す前に、put_Filename および put_CurrentStream を呼び出してファイル名とストリームを設定する。
メディア ディテクタがビットマップ グラブ モードの場合、このメソッドは E_INVALIDARG を返す。詳細については、「EnterBitmapGrabMode」を参照すること。
現在のストリームのメディア タイプのグローバル ユニーク識別子 (GUID) を取得する。
構文
HRESULT get_StreamType( GUID *pVal );
パラメータ
- pVal
- [out, retval] メディア タイプのメジャー タイプ GUID を受け取る変数へのポインタ。
戻り値
HRESULT 値を返す。可能な値は次のとおりである。
S_OK 成功。 E_INVALIDARG 無効な引数。 E_POINTER NULL ポインタ引数。
注意
このメソッドは、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」を参照すること。
現在のストリームのメディア タイプの GUID を表す文字列を取得する。
構文
HRESULT get_StreamTypeB( BSTR *pVal );
パラメータ
- pVal
- [out, retval] メディア タイプ GUID の文字列表現を受け取る BSTR へのポインタ。
戻り値
HRESULT 値を返す。可能な値は次のとおりである。
S_OK 成功。 E_INVALIDARG 無効な引数。 E_POINTER NULL ポインタ引数。
注意
返される BSTR は次のようなフォーマットである。{73647561-0000-0010-8000-00AA00389B71}
このメソッドは、文字列に必要なメモリを割り当てる。アプリケーションは SysFreeString を呼び出して、メモリを解放しなければならない。
このメソッドを呼び出す前に、put_Filename および put_CurrentStream を呼び出してファイル名とストリームを設定する。
メディア ディテクタがビットマップ グラブ モードの場合、このメソッドは E_INVALIDARG を返す。詳細については、「EnterBitmapGrabMode」を参照すること。
メディア ディテクタで使用するストリーム番号を指定する。
構文
HRESULT put_CurrentStream( long newVal );
パラメータ
- newVal
- [in] ストリーム番号。
戻り値
成功した場合は S_OK、それ以外の場合は E_INVALIDARG を返す。
注意
このメソッドを呼び出す前に、put_Filename を呼び出してファイル名を設定する。get_OutputStreams を呼び出して、ソース ファイルに含まれるストリームの個数を調べる。
メディア ディテクタがビットマップ グラブ モードの場合、このメソッドは E_INVALIDARG を返す。詳細については、「EnterBitmapGrabMode」を参照すること。
メディア ディテクタで使用するソース ファイルの名前を指定する。
構文
HRESULT put_Filename( BSTR newVal );
パラメータ
- newVal
- [in] ソースのファイル名。
戻り値
成功した場合は、S_OK を返す。それ以外の場合は、エラーの発生を示す HRESULT 値を返す。
メディア ディテクタで使用するソース フィルタを指定する。
構文
HRESULT put_Filter( IUnknown *newVal );
パラメータ
- newVal
- [in] ソース フィルタの IUnknown インターフェイスを指すポインタ。
戻り値
HRESULT 値を返す。可能な値は次のとおりである。
S_OK 成功。 E_NOINTERFACE newVal はフィルタを指していない。 E_POINTER NULL ポインタ引数。
注意
アプリケーションでは、put_Filename を呼び出す代わりに、ソース フィルタの IUnknown インターフェイスへのポインタを指定してこのメソッドを呼び出すことができる。 既にフィルタ グラフに接続されているフィルタを使用してはならない。
指定されたメディア タイムのポスター フレームを取得し、それをファイルに書き込む。
構文
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 の各種のストリーム情報取得メソッドは機能しない。