Partager via


Génération d’un nouvel objet d’en-tête ASF

Pour convertir les informations contenues dans l’objet ContentInfo au format d’objet d’en-tête ASF binaire, l’application doit appeler IMFASFContentInfo::GenerateHeader. Cet appel doit être effectué une fois que les paquets de données ont été générés et que l’objet ContentInfo contient des informations mises à jour. GenerateHeader retourne un pointeur vers une mémoire tampon de média qui contient les informations d’en-tête au format valide. L’application peut ensuite écrire les données, pointées par la mémoire tampon du média, au début d’un nouveau fichier ASF.

Pour écrire un nouvel objet Header à l’aide de l’objet ContentInfo

  1. Appelez MFCreateASFContentInfo pour créer un objet ContentInfo vide.

  2. Appelez IMFASFContentInfo::SetProfile pour fournir l’objet de profil à l’objet ContentInfo. Pour plus d’informations sur la création de profils, consultez Création d’un profil ASF.

  3. Appelez IMFASFContentInfo::GenerateHeader et passez NULL dans le paramètre pIHeader et recevez la taille de l’objet ContentInfo rempli dans le paramètre pcbHeader . L’application peut utiliser cette valeur pour allouer de la mémoire ou la mémoire tampon multimédia qui contiendra l’objet Header.

    La taille d’en-tête reçue inclut la taille de remplissage, qui est ajustée en fonction de la taille réelle des objets d’en-tête. La taille maximale des objets d’en-tête est de 10 Mo. Si la taille dépasse cette valeur, GenerateHeader échoue avec l’erreur MF_E_ASF_INVALIDDATA.

  4. Appelez MFCreateMemoryBuffer pour créer une mémoire tampon multimédia de la taille reçue à l’étape 3.

  5. Appelez à nouveau GenerateHeader pour générer le nouvel objet d’en-tête ASF à partir de l’objet ContentInfo dans la mémoire tampon de média créée à l’étape 4.

    La longueur des données dans la mémoire tampon du média est mise à jour et la nouvelle taille est retournée dans le paramètre pcbHeader .

  6. Écrivez le contenu de la mémoire tampon multimédia au début du fichier. L’application peut utiliser le flux d’octets pour effectuer l’opération d’écriture. Pour obtenir un exemple de code, consultez IMFByteStream::Write.

Exemple

L’exemple de code suivant montre comment créer un objet ContentInfo et générer une mémoire tampon multimédia pour stocker le nouvel objet Header. Pour obtenir un exemple complet qui utilise ce code, consultez Tutoriel : Copie de flux ASF d’un fichier vers un autre.

//-------------------------------------------------------------------
// 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;
}

Écriture d’un objet d’en-tête ASF pour un nouveau fichier