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


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

Приемник файлов 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