Добавление метаданных в приемник файлов
Приемник файлов ASF — это реализация IMFMediaSink , предоставляемая Media Foundation, которую приложение может использовать для архивации данных мультимедиа ASF в файл. Сведения об объектной модели приемников мультимедиа ASF и общем использовании см. в разделе Приемники мультимедиа ASF.
После создания приемника файлов ASF необходимо настроить сведения о потоках и кодировке в выходном файле. Эти процедуры описаны в разделах Добавление сведений о потоке в приемник файлов ASF и Настройка свойств в приемнике файлов. Кроме того, можно добавить сведения о метаданных, включая пары "имя-значение", такие как "Автор", "Заголовок". В этом разделе описывается процесс добавления сведений о метаданных в приемник файла, чтобы они отображались в конечном объекте заголовка ASF.
Сведения о метаданных можно добавить в приемник файлов ASF перед созданием топологии кодирования. Объект ASF ContentInfo для приемника файлов отслеживает свойства метаданных и предоставляется приложению через интерфейс IMFMetadata . Некоторые из этих свойств, например IsVBR, которые указывают, содержит ли файл потоки переменной скорости (VBR), автоматически задаются приемником файла путем синтаксического анализа заданных свойств кодирования потока.
Полный список свойств см. в разделе "Список атрибутов" документации по пакету SDK для форматирования.
Использование интерфейса IMFMetadata в приемнике файлов ASF
Запросите объект приемника файлов ASF, чтобы получить указатель на его реализацию интерфейса IMFMetadataProvider .
Вызовите IMFMetadataProvider::GetMFMetadata , чтобы получить указатель IMFMetadata .
Параметр pPresentationDescriptor игнорируется, и приложение может передать значение NULL. Если приложение передает ноль в качестве идентификатора потока в параметре dwStreamIdentifier , метод извлекает метаданные, которые применяются ко всему 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;
}
Связанные темы