ファイル シンクへのメタデータの追加
ASF ファイル シンクは、アプリケーションが ASF メディア データをファイルにアーカイブするために使用できる Media Foundation によって提供される IMFMediaSink の実装です。 ASF メディア シンクのオブジェクト モデルと一般的な使用方法については、「 ASF メディア シンク」を参照してください。
ASF ファイル シンクを作成した後、出力ファイル内のストリームとエンコード情報に関する情報を使用して構成する必要があります。 これらの手順については、「ASF ファイル シンクへのストリーム情報の追加」および「ファイル シンクのプロパティの設定」を参照してください。 さらに、"Author"、Title" などの名前と値のペアを含むメタデータ情報を追加することもできます。 このトピックでは、最終的な ASF ヘッダー オブジェクトに表示されるように、ファイル シンクにメタデータ情報を追加するプロセスについて説明します。
エンコード トポロジを構築する前に、ASF ファイル シンクにメタデータ情報を追加できます。 ファイル シンクの ASF ContentInfo オブジェクトはメタデータ プロパティを追跡し、 IMFMetadata インターフェイスを介してアプリケーションに公開されます。 ファイルに可変ビット レート (VBR) ストリームが含まれているかどうかを示す "IsVBR" などの一部のプロパティは、設定されたストリーム エンコード プロパティを解析することによって、ファイル シンクによって自動的に設定されます。
プロパティの完全な一覧については、FORMAT SDK のドキュメントの「属性リスト」トピックを参照してください。
ASF ファイル シンクでの IMFMetadata インターフェイスの使用
ASF ファイル シンク オブジェクトにクエリを実行して、 IMFMetadataProvider インターフェイスの実装へのポインターを取得します。
IMFMetadataProvider::GetMFMetadata を呼び出して、IMFMetadata ポインターを取得します。
pPresentationDescriptor パラメーターは無視され、アプリケーションは NULL を渡すことができます。 アプリケーションが dwStreamIdentifier パラメーターのストリーム識別子として 0 を渡す場合、メソッドは ASF ファイル全体に適用されるメタデータを取得します。 それ以外の場合は、ストリームのメタデータのみが取得されます。
IMFMetadata::GetAllPropertyNames を呼び出して、メディア コンテンツに設定されているファイル エンコード プロパティの一覧を取得します。
IMFMetadata::GetProperty を呼び出して、プロパティ値を取得します。
例
次のコード例は、ASF ファイルに設定されているプロパティの名前と値を列挙する方法を示しています。
/////////////////////////////////////////////////////////////////////
// Name: ListASFProperties
//
// Enumerates the metadata properties of the ASF file.
//
// pContentInfo: Pointer to the ASF ContentInfo object.
/////////////////////////////////////////////////////////////////////
HRESULT ListASFProperties(IMFASFContentInfo *pContentInfo)
{
HRESULT hr = S_OK;
PROPVARIANT varNames;
PropVariantInit(&varNames);
PROPVARIANT varValue;
PropVariantInit(&varValue);
IMFMetadataProvider* pProvider = NULL;
IMFMetadata* pMetadata = NULL;
// Query the ContentInfo object for IMFMetadataProvider.
CHECK_HR(hr = pContentInfo->QueryInterface(IID_IMFMetadataProvider,
(void**)&pProvider));
// Get a pointer to IMFMetadata for file-wide metadata.
CHECK_HR(hr = pProvider->GetMFMetadata(NULL, 0, 0, &pMetadata));
// Get the property names that are stored in the metadata object.
CHECK_HR(hr = pMetadata->GetAllPropertyNames(&varNames));
// Loop through the properties and get their values.
if (varNames.vt == (VT_VECTOR | VT_LPWSTR))
{
ULONG cElements = varNames.calpwstr.cElems;
for (ULONG i = 0; i < cElements; i++)
{
const WCHAR* sName = varNames.calpwstr.pElems[i];
CHECK_HR(hr = pMetadata->GetProperty(sName, &varValue));
//Use the property values. Not shown.
PropVariantClear(&varValue);
}
}
done:
PropVariantClear(&varNames);
PropVariantClear(&varValue);
SAFE_RELEASE (pMetaData);
SAFE_RELEASE (pProvider);
return hr;
}
関連トピック