Hinzufügen von Streaminformationen zur ASF-Dateisenke

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

Nach dem Instanziieren der Dateisenke muss sie vor dem Erstellen der Topologie konfiguriert werden. Die Dateisenke muss über die Datenströme in der Ausgabedatei, die Informationen zum Codierungsmodus und die Metadaten bescheid wissen. In diesem Thema wird der Prozess des Hinzufügens von Stream in der Dateisenke beschrieben.

Hinzufügen von Streams in der ASF-Dateisenke

Die Dateisenke muss die Ausgabeströme und deren Eigenschaften kennen, damit sie Ausgabebeispiele entsprechend generieren und der ASF-Ausgabedatei hinzufügen kann. Diese Einstellungen werden in das endgültige ASF-Headerobjekt geschrieben.

Zum Festlegen von Streaminformationen benötigen Sie einen Verweis auf das ASF ContentInfo-Objekt der Dateisenke. Weitere Informationen finden Sie unter Erstellen der ASF-Dateisenke.

Im folgenden Verfahren werden die allgemeinen Schritte zum Konfigurieren des Datenstroms mithilfe des ASF-Profilobjekts zusammengefasst.

So konfigurieren Sie Streaminformationen in der ASF-Dateisenke

  1. Erstellen Sie ein ASF-Profilobjekt, indem Sie MFCreateASFProfile aufrufen.

  2. Erstellen Sie für jeden Stream in der Ausgabedatei einen Medientyp für den Zielstream, der der Dateisenke hinzugefügt werden soll. Der Medientyp muss mit den Ausgabetypen kompatibel sein, die von den Windows Media-Encodern unterstützt werden.

    Informationen zum Hinzufügen von Audiostreams zum Profil finden Sie unter Erstellen von Audiostreams für die ASF-Codierung.

    Informationen zum Hinzufügen von Videostreams zum Profil finden Sie unter Erstellen von Videostreams für die ASF-Codierung.

  3. Erstellen Sie Streams basierend auf den in Schritt 2 erstellten Medientypen, indem Sie IMFASFProfile::CreateStream aufrufen.

  4. Weisen Sie eine Streamnummer für den neu erstellten Stream zu, indem Sie den in Schritt 3 empfangenen IMFASFStreamConfig-Schnittstellenzeiger aufrufen.

  5. Konfigurieren Sie den Stream optional mit den folgenden Informationen:

  6. Legen Sie optional die Größe des Datenpakets für das Profil fest, indem Sie MF_ASFPROFILE_MINPACKETSIZE - und MF_ASFPROFILE_MAXPACKETSIZE-Attribute festlegen. Das ASF-Profil macht die IMFAttributes-Schnittstelle verfügbar, auf die eine Anwendung durch Aufrufen von IMFASFProfile::QueryInterface verweisen kann.

  7. Legen Sie Codierungsinformationen für den Stream in der Dateisenke fest. Erläutert unter Festlegen von Eigenschaften in der Dateisenke.

  8. Fügen Sie den Stream zum Profil hinzu, indem Sie IMFASFProfile::SetStream aufrufen.

  9. Ordnen Sie das Profil dem ContentInfo-Objekt zu, indem Sie IMFASFContentInfo::SetProfile aufrufen.

Um einen vorhandenen Stream zu ändern, kann die Anwendung einen Verweis auf die IMFASFStreamConfig-Schnittstelle des Streams abrufen und ihn entsprechend den Anforderungen neu konfigurieren. Zum Hinzufügen oder Entfernen von Streams muss die Anwendung IMFASFProfile::RemoveStream aufrufen. Um diese Änderungen, Streamänderungen oder das Entfernen anzuwenden, müssen Sie das Profil im ContentInfo-Objekt erneut festlegen. Dadurch wird das vorhandene Profil überschrieben, das bereits dem ContentInfo-Objekt zugeordnet ist.

//-------------------------------------------------------------------
//  CreateVideoStream
//  Create an video stream and add it to the profile.
//
//  pProfile: A pointer to the ASF profile.
//  wStreamNumber: Stream number to assign for the new stream.
//    pType: A pointer to the source's video media type.
//-------------------------------------------------------------------

HRESULT CreateVideoStream(IMFASFProfile* pProfile, WORD wStreamNumber, IMFMediaType* pType)
{
    if (!pProfile)
    {
        return E_INVALIDARG;
    }
    if (wStreamNumber < 1 || wStreamNumber > 127 )
    {
        return MF_E_INVALIDSTREAMNUMBER;
    }

    HRESULT hr = S_OK;

    
    IMFMediaType* pVideoType = NULL;
    IMFASFStreamConfig* pVideoStream = NULL;

    UINT32 dwBitRate = 0;
        
    //Create a new video type from the source type
    hr = CreateCompressedVideoType(pType, &pVideoType);
    if (FAILED(hr))
    {
        goto done;
    }

    //Create a new stream with the video type
    hr = pProfile->CreateStream(pVideoType, &pVideoStream);
    if (FAILED(hr))
    {
        goto done;
    }
    

    //Set a valid stream number
    hr = pVideoStream->SetStreamNumber(wStreamNumber);
    if (FAILED(hr))
    {
        goto done;
    }

    //Add the stream to the profile
    hr = pProfile->SetStream(pVideoStream);
    if (FAILED(hr))
    {
        goto done;
    }

    wprintf_s(L"Video Stream created. Stream Number: %d .\n", wStreamNumber);

done:

    SafeRelease(&pVideoStream);
    SafeRelease(&pVideoType);

    return hr;
}

Aufzählen von Streamsenken

Für jeden Stream im Profil, den das ContentInfo-Objekt kennt, erstellt und fügt die ASF-Dateisenke eine Streamsenke hinzu, die alle Eigenschaften des codierten Datenstroms enthält. Die ASF-Dateisenke ist so konzipiert, dass sie feste Datenströme enthält. Dies bedeutet, dass Sie keine Streams hinzufügen oder entfernen können, indem Sie IMFMediaSink::AddStreamSink oder IMFMediaSink::RemoveStreamSink aufrufen. Diese Aufrufe der Dateisenke schlagen mit dem MF_E_STREAMSINKS_FIXED Fehlercode fehl. Das Hinzufügen oder Entfernen von Streams im Profil führt nicht automatisch zum Hinzufügen oder Entfernen der Streamsenken in der Dateisenke. Sie müssen die vorhandene instance der Datei verwerfen und mit neuen Streaminformationen neu erstellen, wenn sich Ihre Streams im Profil geändert haben.

Das folgende Verfahren fasst die allgemeinen Schritte zum Auflisten von Streamsenken in der ASF-Dateisenke zusammen.

So enumerieren Sie Streamsenken

  1. Rufen Sie IMFMediaSink::GetStreamSinkCount auf, um die Gesamtanzahl der Streamsenken in der ASF-Dateisenke abzurufen.

  2. Schleife durch die Streamsenken und abrufen einen Verweis auf die GetStreamSinkByIndex-Schnittstelle der Streamsenke.

    Oder

    Rufen Sie IMFMediaSink::GetStreamSinkById auf, um die Streamsenke abzurufen, indem Sie die Streamnummer angeben. Jede Streamsenke wird mit der Streamnummer identifiziert, die Sie beim Erstellen des Datenstroms im Profil festgelegt haben.

Wenn Sie eine partielle Topologie zum Codieren einer Mediendatei erstellen, müssen Sie die Dateisenke der Topologie als Ausgabetopologieknoten hinzufügen. Dazu können Sie entweder jede Dampfsenke in der Dateisenke angeben oder das Dateisenkenaktivierungsobjekt und die Streamsenkenbezeichner festlegen. Weitere Informationen und codebeispiel finden Sie unter Erstellen von Ausgabeknoten.

ASF-Mediensenken

ASF-Unterstützung in Media Foundation