Condividi tramite


Generazione di un nuovo oggetto intestazione ASF

Per convertire le informazioni contenute nell'oggetto ContentInfo in un formato ASF Header Object binario, l'applicazione deve chiamare IMFASFContentInfo::GenerateHeader. Questa chiamata deve essere eseguita dopo la generazione dei pacchetti di dati e l'oggetto ContentInfo contiene informazioni aggiornate. GenerateHeader restituisce un puntatore a un buffer multimediale contenente le informazioni sull'intestazione nel formato valido. L'applicazione può quindi scrivere i dati, a cui punta il buffer multimediale, all'inizio di un nuovo file ASF.

Per scrivere un nuovo oggetto Header utilizzando l'oggetto ContentInfo

  1. Chiamare MFCreateASFContentInfo per creare un oggetto ContentInfo vuoto.

  2. Chiamare IMFASFContentInfo::SetProfile per fornire l'oggetto profilo all'oggetto ContentInfo. Per informazioni sulla creazione di profili, vedere Creazione di un profilo ASF.

  3. Chiamare IMFASFContentInfo::GenerateHeader e passare NULL nel parametro pIHeader e ricevere le dimensioni dell'oggetto ContentInfo popolato nel parametro pcbHeader . L'applicazione può usare questo valore per allocare memoria o il buffer multimediale che conterrà l'oggetto Header.

    Le dimensioni dell'intestazione ricevute includono la dimensione di riempimento, modificata a seconda delle dimensioni effettive degli oggetti intestazione. La dimensione massima degli oggetti intestazione è 10 MB. Se le dimensioni superano questo valore, GenerateHeader ha esito negativo con l'errore MF_E_ASF_INVALIDDATA.

  4. Chiamare MFCreateMemoryBuffer per creare un buffer multimediale delle dimensioni ricevute nel passaggio 3.

  5. Chiamare di nuovo GenerateHeader per generare il nuovo oggetto intestazione ASF dall'oggetto ContentInfo nel buffer multimediale creato nel passaggio 4.

    La lunghezza dei dati nel buffer multimediale viene aggiornata e le nuove dimensioni vengono restituite nel parametro pcbHeader .

  6. Scrivere il contenuto del buffer multimediale all'inizio del file. L'applicazione può usare il flusso di byte per eseguire l'operazione di scrittura. Per un esempio di codice, vedere IMFByteStream::Write.

Esempio

Il codice di esempio seguente illustra come creare un oggetto ContentInfo e generare un buffer multimediale per archiviare il nuovo oggetto Header. Per un esempio completo che usa questo codice, vedere Esercitazione: Copia di flussi ASF da un file a un altro.

//-------------------------------------------------------------------
// WriteASFFile
//
// Writes the complete ASF file.
//-------------------------------------------------------------------

HRESULT WriteASFFile( 
    IMFASFContentInfo *pContentInfo, // ASF Content Info for the output file.
    IMFByteStream *pDataStream,      // Data stream.
    PCWSTR pszFile                   // Output file name.
    )
{
    
    IMFMediaBuffer *pHeaderBuffer = NULL;
    IMFByteStream *pWmaStream = NULL;

    DWORD cbHeaderSize = 0;
    DWORD cbWritten = 0;

    // Create output file.
    HRESULT hr = MFCreateFile(
        MF_ACCESSMODE_WRITE, 
        MF_OPENMODE_DELETE_IF_EXIST,
        MF_FILEFLAGS_NONE,
        pszFile,
        &pWmaStream
        );

    // Get the size of the ASF Header Object.
    if (SUCCEEDED(hr))
    {
        hr = pContentInfo->GenerateHeader(NULL, &cbHeaderSize);
    }

    // Create a media buffer.
    if (SUCCEEDED(hr))
    {
        hr = MFCreateMemoryBuffer(cbHeaderSize, &pHeaderBuffer);
    }

    // Populate the media buffer with the ASF Header Object.
    if (SUCCEEDED(hr))
    {
        hr = pContentInfo->GenerateHeader(pHeaderBuffer, &cbHeaderSize);
    }
 
    // Write the header contents to the byte stream for the output file.
    if (SUCCEEDED(hr))
    {
        hr = WriteBufferToByteStream(pWmaStream, pHeaderBuffer, &cbWritten);
    }

    if (SUCCEEDED(hr))
    {
        hr = pDataStream->SetCurrentPosition(0);
    }

    // Append the data stream to the file.

    if (SUCCEEDED(hr))
    {
        hr = AppendToByteStream(pDataStream, pWmaStream);
    }

    SafeRelease(&pHeaderBuffer);
    SafeRelease(&pWmaStream);

    return hr;
}

Scrittura di un oggetto intestazione ASF per un nuovo file