Compartilhar via


Adicionando metadados ao coletor de arquivos

O coletor de arquivos ASF é uma implementação do IMFMediaSink fornecida pelo Media Foundation que um aplicativo pode usar para arquivar dados de mídia ASF em um arquivo. Para obter informações sobre o modelo de objeto e o uso geral dos Coletores de Mídia do ASF, consulte Coletores de Mídia ASF.

Depois de Criar o coletor de arquivos ASF, ele deve ser configurado com informações sobre os fluxos e as informações de codificação no arquivo de saída. Esses procedimentos são descritos em Adicionando informações de fluxo ao coletor de arquivos ASF e definindo propriedades no coletor de arquivos. Além disso, você também pode adicionar informações de metadados inclui pares nome/valor, como "Autor", Título". Este tópico descreve o processo de adição de informações de metadados ao coletor de arquivos para que ele apareça no objeto de cabeçalho ASF final.

Você pode adicionar informações de metadados ao coletor de arquivos ASF antes de criar a topologia de codificação. O objeto ContentInfo do ASF para o coletor de arquivos controla as propriedades de metadados e é exposto ao aplicativo por meio da interface IMFMetadata . Algumas dessas propriedades, como "IsVBR" que indica se o arquivo contém fluxos de VBR (taxa de bits variáveis), são definidas automaticamente pelo coletor de arquivos analisando as propriedades de codificação de fluxo definidas.

Para obter uma lista completa de propriedades, consulte o tópico "Lista de Atributos" na documentação formatar SDK.

Usando a interface IMFMetadata no coletor de arquivos ASF

  1. Consulte o objeto do coletor de arquivos ASF para obter um ponteiro para sua implementação da interface IMFMetadataProvider .

  2. Chame IMFMetadataProvider::GetMFMetadata para obter um ponteiro IMFMetadata .

    O parâmetro pPresentationDescriptor é ignorado e o aplicativo pode passar NULL. Se o aplicativo passar zero como o identificador de fluxo no parâmetro dwStreamIdentifier , o método recuperará metadados que se aplicam a todo o arquivo ASF. Caso contrário, somente os metadados do fluxo serão recuperados.

  3. Chame IMFMetadata::GetAllPropertyNames para recuperar a lista de propriedades de codificação de arquivo definidas no conteúdo da mídia.

  4. Chame IMFMetadata::GetProperty para obter os valores da propriedade.

Exemplo

O código de exemplo a seguir mostra como enumerar os nomes de propriedade e os valores definidos no arquivo 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;
}

Coletores de mídia ASF

Componentes asf da camada de pipeline

Suporte do ASF no Media Foundation