Lesen des ASF-Headerobjekts einer vorhandenen Datei

Das ASF ContentInfo-Objekt speichert Informationen, die die ASF-Headerobjekte einer Mediendatei darstellen. Ein aufgefülltes ContentInfo-Objekt ist erforderlich, um eine vorhandene ASF-Datei zu lesen und zu analysieren.

Nach dem Erstellen des ContentInfo-Objekts durch Aufrufen der MFCreateASFContentInfo-Funktion muss die Anwendung es mit Headerinformationen aus der zu lesenden ASF-Datei initialisieren. Um das Objekt aufzufüllen, rufen Sie IMFASFContentInfo::P arseHeader auf.

ParseHeader erfordert einen Medienpuffer, der das Header-Objekt der ASF-Datei enthält. Eine Möglichkeit besteht darin, einen Medienpuffer mit dem Header-Objekt zu füllen, um einen Bytedatenstrom für die Datei zu erstellen und dann die ersten 30 Bytedaten aus dem Bytedatenstrom in einen Medienpuffer zu lesen. Sie können dann die Größe abrufen, indem Sie die ersten 24 Bytes des Header-Objekts an die IMFASFContentInfo::GetHeaderSize-Methode übergeben. Nachdem Sie die Größe abgerufen haben, können Sie das gesamte Headerobjekt in einem Medienpuffer lesen und an ParseHeader übergeben. Die -Methode beginnt mit der Analyse des Offsets ab dem Anfang des Medienpuffers, der im cbOffsetWithinHeader-Parameter angegeben ist.

Der folgende Beispielcode erstellt und initialisiert ein ContentInfo-Objekt zum Lesen einer vorhandenen ASF-Datei, die in einem Bytestream enthalten ist. Zunächst definieren wir eine Hilfsfunktion, die Daten aus einem Bytedatenstrom liest und einen Medienpuffer für die Daten zuordnet:

// Read the ASF Header Object from a byte stream and return a pointer to the 
// populated ASF ContentInfo object.
//
// The current read position of the byte stream must be at the start of the
// ASF Header Object.

HRESULT CreateContentInfo(IMFByteStream *pStream, 
    IMFASFContentInfo **ppContentInfo)
{
    const DWORD MIN_ASF_HEADER_SIZE = 30;
    
    QWORD cbHeader = 0;
    DWORD cbBuffer = 0;

    IMFASFContentInfo *pContentInfo = NULL;
    IMFMediaBuffer *pBuffer = NULL;

    // Create the ASF ContentInfo object.
    HRESULT hr = MFCreateASFContentInfo(&pContentInfo);
    
    // Read the first 30 bytes to find the total header size.

    if (SUCCEEDED(hr))
    {
        hr = MFCreateMemoryBuffer(MIN_ASF_HEADER_SIZE, &pBuffer);
    }
    if (SUCCEEDED(hr))
    {
        hr = ReadFromByteStream(pStream, pBuffer,MIN_ASF_HEADER_SIZE);
    }
    if (SUCCEEDED(hr))
    {
        hr = pContentInfo->GetHeaderSize(pBuffer, &cbHeader);
    }

    // Pass the first 30 bytes to the ContentInfo object.
    if (SUCCEEDED(hr))
    {
        hr = pContentInfo->ParseHeader(pBuffer, 0);
    }

    SafeRelease(&pBuffer);

    if (SUCCEEDED(hr))
    {
        cbBuffer = (DWORD)(cbHeader - MIN_ASF_HEADER_SIZE);

        hr = MFCreateMemoryBuffer(cbBuffer, &pBuffer);
    }

    // Read the rest of the header and finish parsing the header.
    if (SUCCEEDED(hr))
    {
        hr = ReadFromByteStream(pStream, pBuffer, cbBuffer);
    }
    if (SUCCEEDED(hr))
    {
        hr = pContentInfo->ParseHeader(pBuffer, MIN_ASF_HEADER_SIZE);
    }
    if (SUCCEEDED(hr))
    {
        // Return the pointer to the caller.
        *ppContentInfo = pContentInfo;
        (*ppContentInfo)->AddRef();
    }
    SafeRelease(&pBuffer);
    SafeRelease(&pContentInfo);
    return hr;
} 

Im nächsten Beispiel wird das ASF-Headerobjekt aus einem Bytestream gelesen und ein ASF ContentInfo-Objekt aufgefüllt.

// Read the ASF Header Object from a byte stream and return a pointer to the 
// populated ASF ContentInfo object.
//
// The current read position of the byte stream must be at the start of the
// ASF Header Object.

HRESULT CreateContentInfo(IMFByteStream *pStream, 
    IMFASFContentInfo **ppContentInfo)
{
    const DWORD MIN_ASF_HEADER_SIZE = 30;
    
    QWORD cbHeader = 0;
    DWORD cbBuffer = 0;

    IMFASFContentInfo *pContentInfo = NULL;
    IMFMediaBuffer *pBuffer = NULL;

    // Create the ASF ContentInfo object.
    HRESULT hr = MFCreateASFContentInfo(&pContentInfo);
    
    // Read the first 30 bytes to find the total header size.

    if (SUCCEEDED(hr))
    {
        hr = MFCreateMemoryBuffer(MIN_ASF_HEADER_SIZE, &pBuffer);
    }
    if (SUCCEEDED(hr))
    {
        hr = ReadFromByteStream(pStream, pBuffer,MIN_ASF_HEADER_SIZE);
    }
    if (SUCCEEDED(hr))
    {
        hr = pContentInfo->GetHeaderSize(pBuffer, &cbHeader);
    }

    // Pass the first 30 bytes to the ContentInfo object.
    if (SUCCEEDED(hr))
    {
        hr = pContentInfo->ParseHeader(pBuffer, 0);
    }

    SafeRelease(&pBuffer);

    if (SUCCEEDED(hr))
    {
        cbBuffer = (DWORD)(cbHeader - MIN_ASF_HEADER_SIZE);

        hr = MFCreateMemoryBuffer(cbBuffer, &pBuffer);
    }

    // Read the rest of the header and finish parsing the header.
    if (SUCCEEDED(hr))
    {
        hr = ReadFromByteStream(pStream, pBuffer, cbBuffer);
    }
    if (SUCCEEDED(hr))
    {
        hr = pContentInfo->ParseHeader(pBuffer, MIN_ASF_HEADER_SIZE);
    }
    if (SUCCEEDED(hr))
    {
        // Return the pointer to the caller.
        *ppContentInfo = pContentInfo;
        (*ppContentInfo)->AddRef();
    }
    SafeRelease(&pBuffer);
    SafeRelease(&pContentInfo);
    return hr;
} 

Hinweis

In diesen Beispielen wird die SafeRelease-Funktion verwendet, um Schnittstellenzeiger freizugeben.

 

ASF ContentInfo-Objekt

ASF-Headerobjekt

ASF-Unterstützung in Media Foundation

Abrufen von Informationen aus ASF-Headerobjekten