Ajout d’informations de flux au récepteur de fichiers ASF

Le récepteur de fichiers ASF est une implémentation de IMFMediaSink fournie par Media Foundation qu’une application peut utiliser pour archiver des données multimédias ASF dans un fichier. Pour plus d’informations sur le modèle objet et l’utilisation générale des récepteurs de média ASF, consultez Récepteurs de média ASF.

Après avoir instancié le récepteur de fichiers, il doit être configuré avant de générer la topologie. Le récepteur de fichiers doit connaître les flux dans le fichier de sortie, les informations sur le mode d’encodage et les métadonnées. Cette rubrique décrit le processus d’ajout de flux dans le récepteur de fichiers.

Ajout de flux dans le récepteur de fichiers ASF

Le récepteur de fichiers doit connaître les flux de sortie et leurs propriétés pour pouvoir générer des exemples de sortie en conséquence et les ajouter au fichier ASF de sortie. Ces paramètres sont écrits dans l’objet d’en-tête ASF final.

Pour définir les informations de flux, vous devez disposer d’une référence à l’objet ContentInfo ASF du récepteur de fichiers. Pour plus d’informations, consultez Création du récepteur de fichiers ASF.

La procédure suivante résume les étapes générales de configuration du flux à l’aide de l’objet de profil ASF.

Pour configurer les informations de flux dans le récepteur de fichiers ASF

  1. Créez un objet de profil ASF en appelant MFCreateASFProfile.

  2. Pour chaque flux dans le fichier de sortie, créez un type de média pour le flux cible à ajouter dans le récepteur de fichiers. Le type de média doit être compatible avec les types de sortie pris en charge par les encodeurs Windows Media.

    Pour plus d’informations sur l’ajout de flux audio au profil, consultez Création de flux audio pour l’encodage ASF.

    Pour plus d’informations sur l’ajout de flux vidéo au profil, consultez Création de flux vidéo pour l’encodage ASF.

  3. Créez des flux en fonction des types de médias créés à l’étape 2 en appelant IMFASFProfile::CreateStream.

  4. Attribuez un numéro de flux pour le flux nouvellement créé en appelant le pointeur d’interface IMFASFStreamConfig reçu à l’étape 3.

  5. Configurez éventuellement le flux avec les informations suivantes :

  6. Définissez éventuellement la taille des paquets de données pour le profil en définissant des attributs MF_ASFPROFILE_MINPACKETSIZE et MF_ASFPROFILE_MAXPACKETSIZE . Le profil ASF expose l’interface IMFAttributes , à laquelle une application peut obtenir une référence en appelant IMFASFProfile::QueryInterface.

  7. Définissez les informations d’encodage du flux dans le récepteur de fichiers. Décrit dans Définition des propriétés dans le récepteur de fichiers.

  8. Ajoutez le flux au profil en appelant IMFASFProfile::SetStream.

  9. Associez le profil à l’objet ContentInfo en appelant IMFASFContentInfo::SetProfile.

Pour modifier un flux existant, l’application peut obtenir une référence à l’interface IMFASFStreamConfig du flux et la reconfigurer en fonction des exigences. Pour ajouter ou supprimer des flux, l’application doit appeler IMFASFProfile::RemoveStream. Pour appliquer ces modifications, diffuser des modifications ou supprimer, vous devez définir à nouveau le profil dans l’objet ContentInfo. Cela remplace le profil existant qui est déjà associé à l’objet ContentInfo.

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

Énumération des récepteurs de flux

Pour chaque flux du profil dont l’objet ContentInfo a connaissance, le récepteur de fichiers ASF crée et ajoute un récepteur de flux qui contient toutes les propriétés du flux encodé. Le récepteur de fichiers ASF est conçu pour contenir des flux fixes. Cela signifie que vous ne pouvez pas ajouter ou supprimer des flux en appelant IMFMediaSink::AddStreamSink ou IMFMediaSink::RemoveStreamSink. Ces appels sur le récepteur de fichiers échouent avec le code d’erreur MF_E_STREAMSINKS_FIXED. L’ajout ou la suppression de flux dans le profil n’ajoute pas ou ne supprime pas automatiquement les récepteurs de flux dans le récepteur de fichiers. Vous devez ignorer le instance existant du fichier et le recréer avec de nouvelles informations de flux si vos flux dans le profil ont changé.

La procédure suivante résume les étapes générales de l’énumération des récepteurs de flux dans le récepteur de fichiers ASF.

Pour énumérer les récepteurs de flux

  1. Appelez IMFMediaSink::GetStreamSinkCount pour obtenir le nombre total de récepteurs de flux dans le récepteur de fichiers ASF.

  2. Parcourez en boucle les récepteurs de flux pour obtenir une référence à l’interface GetStreamSinkByIndex du récepteur de flux.

    -ou-

    Appelez IMFMediaSink::GetStreamSinkById pour obtenir le récepteur de flux en spécifiant le numéro de flux. Chaque récepteur de flux est identifié avec le numéro de flux que vous définissez lors de la création du flux dans le profil.

Si vous créez une topologie partielle pour l’encodage d’un fichier multimédia, vous devez ajouter le récepteur de fichiers à la topologie en tant que nœud de topologie de sortie. Vous pouvez le faire en spécifiant chaque récepteur de vapeur dans le récepteur de fichiers ou en définissant l’objet d’activation du récepteur de fichiers et les identificateurs du récepteur de flux. Pour plus d’informations et pour obtenir un exemple de code, consultez Création de nœuds de sortie.

Récepteurs de média ASF

Prise en charge d’ASF dans Media Foundation