Hinzufügen von Metadaten zur Dateisenke

Die ASF-Dateisenke ist eine Implementierung von VONMEDIASink, die von Media Foundation bereitgestellt wird, die eine Anwendung zum Archivieren von ASF-Mediendaten in einer Datei verwenden kann. Informationen zum Objektmodell und zur allgemeinen Verwendung von ASF-Mediensenken finden Sie unter ASF-Mediensenken.

Nach dem Erstellen der ASF-Dateisenkemuss sie mit Informationen zu den Streams und Codierungsinformationen in der Ausgabedatei konfiguriert werden. Diese Verfahren werden unter Hinzufügen von Streaminformationen zur ASF-Dateisenke und Festlegen von Eigenschaften in der Dateisenkebeschrieben. Darüber hinaus können Sie Metadateninformationen hinzufügen, einschließlich Name-Wert-Paaren wie "Autor", Titel". In diesem Thema wird beschrieben, wie Metadateninformationen zur Dateisenke hinzugefügt werden, sodass sie im endgültigen ASF-Headerobjektangezeigt werden.

Sie können der ASF-Dateisenke Metadateninformationen hinzufügen, bevor Sie die Codierungstopologie erstellen. Das ASF ContentInfo-Objekt für die Dateisenke verfolgt die Metadateneigenschaften nach und wird für die Anwendung über die INTERFACESMetadata-Schnittstelle verfügbar gemacht. Einige dieser Eigenschaften, z. B. "IsVBR", die angeben, ob die Datei VBR-Datenströme (Variable Bit Rate) enthält, werden automatisch von der Dateisenke festgelegt, indem die festgelegten Streamcodierungseigenschaften analysieren werden.

Eine vollständige Liste der Eigenschaften finden Sie im Thema "Attributliste" in der Format SDK-Dokumentation.

Verwenden der INTERFACESMetadata-Schnittstelle für die ASF-Dateisenke

  1. Fragen Sie das ASF-Dateisenkenobjekt ab, um einen Zeiger auf seine Implementierung der INTERFACESMetadataProvider-Schnittstelle abzurufen.

  2. Rufen Sie DEN CURSORMetadataProvider::GetMFMetadata auf, um einen POINTERMetadata-Zeiger abzurufen.

    Der pPresentationDescriptor-Parameter wird ignoriert, und die Anwendung kann NULL übergeben. Wenn die Anwendung 0 (null) als Streambezeichner im dwStreamIdentifier-Parameter übergibt, ruft die Methode Metadaten ab, die für die gesamte ASF-Datei gelten. Andernfalls werden nur die Metadaten für den Stream abgerufen.

  3. Rufen Sie DIE DATEIMETADATA::GetAllPropertyNames auf, um die Liste der Dateicodierungseigenschaften abzurufen, die für den Medieninhalt festgelegt sind.

  4. Rufen Sie DIE EIGENSCHAFTSMETADATA::GetProperty auf, um die Eigenschaftswerte abzurufen.

Beispiel

Der folgende Beispielcode zeigt, wie die Eigenschaftennamen und -werte aufzählt werden, die für die ASF-Datei festgelegt sind.

/////////////////////////////////////////////////////////////////////
// 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-Mediensenken

ASF-Komponenten auf Pipelineebene

ASF-Unterstützung in Media Foundation