Поделиться через


Добавление метаданных в приемник файлов

Приемник файлов ASF — это реализация IMFMediaSink , предоставляемая Media Foundation, которую приложение может использовать для архивации данных мультимедиа ASF в файл. Сведения об объектной модели приемников мультимедиа ASF и общем использовании см. в разделе Приемники мультимедиа ASF.

После создания приемника файлов ASF необходимо настроить сведения о потоках и кодировке в выходном файле. Эти процедуры описаны в разделах Добавление сведений о потоке в приемник файлов ASF и Настройка свойств в приемнике файлов. Кроме того, можно добавить сведения о метаданных, включая пары "имя-значение", такие как "Автор", "Заголовок". В этом разделе описывается процесс добавления сведений о метаданных в приемник файла, чтобы они отображались в конечном объекте заголовка ASF.

Сведения о метаданных можно добавить в приемник файлов ASF перед созданием топологии кодирования. Объект ASF ContentInfo для приемника файлов отслеживает свойства метаданных и предоставляется приложению через интерфейс IMFMetadata . Некоторые из этих свойств, например IsVBR, которые указывают, содержит ли файл потоки переменной скорости (VBR), автоматически задаются приемником файла путем синтаксического анализа заданных свойств кодирования потока.

Полный список свойств см. в разделе "Список атрибутов" документации по пакету SDK для форматирования.

Использование интерфейса IMFMetadata в приемнике файлов ASF

  1. Запросите объект приемника файлов ASF, чтобы получить указатель на его реализацию интерфейса IMFMetadataProvider .

  2. Вызовите IMFMetadataProvider::GetMFMetadata , чтобы получить указатель IMFMetadata .

    Параметр pPresentationDescriptor игнорируется, и приложение может передать значение NULL. Если приложение передает ноль в качестве идентификатора потока в параметре dwStreamIdentifier , метод извлекает метаданные, которые применяются ко всему ASF-файлу. В противном случае извлекаются только метаданные для потока.

  3. Вызовите IMFMetadata::GetAllPropertyNames , чтобы получить список свойств кодирования файлов, заданных для содержимого мультимедиа.

  4. Вызовите 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;
}

Приемники мультимедиа ASF

Компоненты ASF уровня конвейера

Поддержка ASF в Media Foundation