Partager via


Création de l’objet Multiplexer

Le multiplexeur ASF est un objet de couche WMContainer qui fonctionne avec l’objet de données ASF et donne à une application la possibilité de générer des paquets de données ASF pour les flux multimédias.

L’objet multiplexeur expose l’interface IMFASFMultiplexer . Pour créer le multiplexeur, appelez MFCreateASFMultiplexer. Cette fonction retourne un pointeur vers un objet vide. Si l’application écrit un nouveau fichier ASF, l’application doit initialiser le multiplexeur avec un objet ContentInfo. Pour ce faire, appelez IMFASFMultiplexer::Initialize. L’objet ContentInfo spécifié représente l’objet d’en-tête ASF du nouveau fichier. Pour plus d’informations sur la création et l’initialisation de l’objet ContentInfo pour un nouveau fichier, consultez Initialisation de l’objet ContentInfo d’un nouveau fichier ASF.

La méthode Initialize analyse l’objet ContentInfo pour collecter des informations de configuration de flux telles que le nombre de flux, la taille des paquets, le pré-inscription. Si vous le souhaitez, le multiplexeur peut également avoir besoin de paramètres de compartiment qui fuient et d’unités d’extension de charge utile. Ces informations sont nécessaires pour générer des paquets de données qui correspondent aux exigences définies dans l’objet d’en-tête ASF. La méthode Initialize configure le multiplexeur en fonction du type de média et des paramètres de configuration des flux. Par exemple, si un flux est configuré pour avoir des extensions de charge utile (consultez Création et configuration de flux ASF), puis que le multiplexeur est configuré pour ajouter ces valeurs aux paquets de données générés.

La méthode Initialize obtient également un handle pour l’objet de données initial qui a été créé lors de la création de l’objet ContentInfo pour l’écriture. Pendant la génération de paquets de données, le multiplexeur ajoute des paquets à l’objet de données et le met à jour de manière appropriée. Une fois que le multiplexeur a généré tous les paquets de données, il met à jour l’objet ContentInfo fourni afin que certaines valeurs, telles que le nombre de paquets de données, soient mises à jour.

L’exemple de code suivant montre comment créer un multiplexeur et l’initialiser avec un objet ContentInfo.

//-------------------------------------------------------------------
// CreateOutputGenerators
//
// Creates the ASF mux and the ASF Content Info object for the 
// output file.
//-------------------------------------------------------------------

HRESULT CreateOutputGenerators(
    IMFASFProfile *pProfile, 
    IMFASFContentInfo **ppContentInfo, 
    IMFASFMultiplexer **ppMux
    )
{
    IMFASFContentInfo *pContentInfo = NULL;
    IMFASFMultiplexer *pMux = NULL;

    // Use the ASF profile to create the ContentInfo object.
    HRESULT hr = MFCreateASFContentInfo(&pContentInfo);

    if (SUCCEEDED(hr))
    {
        hr = pContentInfo->SetProfile(pProfile);
    }

    // Create the ASF Multiplexer object.
    if (SUCCEEDED(hr))
    {
        hr = MFCreateASFMultiplexer(&pMux);
    }
    
    // Initialize it using the new ContentInfo object.
    if (SUCCEEDED(hr))
    {
        hr = pMux->Initialize(pContentInfo);
    }

    // Return the pointers to the caller.
    if (SUCCEEDED(hr))
    {
        *ppContentInfo = pContentInfo;
        (*ppContentInfo)->AddRef();

        *ppMux = pMux;
        (*ppMux)->AddRef();
    }

    SafeRelease(&pContentInfo);
    SafeRelease(&pMux);

    return hr;
}

Pour voir cette fonction utilisée dans une application complète, consultez Tutoriel : Copie de flux ASF d’un fichier vers un autre.

Paramètres d’initialisation du multiplexeur et de compartiment fuite

La méthode IMFASFMultiplexer::Initialize configure le multiplexeur pour déterminer le flux de données de compartiment qui fuit. Pour configurer ces paramètres, vérifiez que les valeurs de propriété suivantes sont définies sur l’objet ContentInfo spécifié. Pour plus d’informations sur la définition de ces propriétés, consultez Définition des propriétés dans l’objet ContentInfo.

  • MFPKEY_ASFMEDIASINK_AUTOADJUST_BITRATE propriété : indique si le multiplexeur doit ajuster automatiquement le débit binaire pour maintenir le flux de données dans le compartiment qui fuit. Ce paramètre peut être modifié par l’application en appelant IMFASFMultiplexer::SetFlags et en passant l’indicateur MFASF_MULTIPLEXER_AUTOADJUST_BITRATE .

  • MFPKEY_ASFMEDIASINK_BASE_SENDTIME propriété : l’heure d’envoi indique quand la charge utile à l’intérieur du compartiment qui fuit sera libérée. Les heures d’envoi doivent être égales ou antérieures à l’heure de présentation, car la charge utile doit avoir le temps d’atteindre la destination avant l’heure de présentation.

    Cette valeur de propriété est la première heure d’envoi. Le multiplexeur utilise cette valeur pour calculer les temps d’envoi suivants afin de s’assurer que les données transitent régulièrement par le compartiment. Si l’indicateur de MFASF_MULTIPLEXER_AUTOADJUST_BITRATE a été défini sur le multiplexeur, le multiplexeur ajuste le débit binaire afin que la charge utile soit envoyée lorsque la fenêtre de mémoire tampon est sur le bord du plein. Si l’indicateur n’est pas défini, le multiplexeur ne parvient pas à générer des paquets de données en raison d’un dépassement de bande passante.

Le multiplexeur obtient des informations de configuration de flux à partir du profil ASF associé à l’objet ContentInfo spécifié dans la méthode Initialize . Les informations de configuration de flux incluent des paramètres de compartiment qui fuient. Cette valeur est requise par le multiplexeur pour générer des paquets de données.

Pour spécifier les paramètres de compartiment qui fuient, définissez les valeurs dans l’attribut MF_ASFSTREAMCONFIG_LEAKYBUCKET1 sur l’objet de configuration de flux qui représente le flux dans le profil. Pour utiliser la valeur de la fenêtre de mémoire tampon, qui est utilisée par l’encodeur, appelez IWMCodecLeakyBucket::GetBufferSizeBits. La valeur réelle de la fenêtre de mémoire tampon est connue uniquement après avoir défini le type de média de sortie de l’encodeur. Pour plus d’informations sur la définition du type de média de sortie, consultez Négociation du type de média sur l’encodeur.

Notes

Les valeurs de compartiment qui fuient utilisées par l’encodeur peuvent être différentes dans l’objet ContentInfo fourni par le profil ASF utilisé pour créer le multiplexeur.

 

La méthode Initialize met à jour l’objet ContentInfo afin que les valeurs correctes soient répercutées dans l’objet d’en-tête ASF final.

Multiplexeur ASF

Génération de nouveaux paquets de données ASF