Source du média ASF

Media Foundation fournit la source multimédia ASF qu’une application peut utiliser pour représenter un fichier ASF dans la couche de pipeline de l’architecture.

Pour lire un fichier ASF, une application peut utiliser la source multimédia ASF pour alimenter des données dans un pipeline de lecture. Dans un scénario d’encodage, l’application peut utiliser la source multimédia ASF comme source pour la conversion dans un autre format ou pour convertir un fichier à débit binaire plus élevé en fichier à débit binaire inférieur sans modifier les formats. La source multimédia ASF doit être utilisée dans la couche de pipeline, c’est-à-dire qu’une application doit utiliser la session multimédia pour contrôler l’opération. Ce niveau d’accès permet aux applications d’obtenir des événements pendant que la session multimédia est en cours. Pour obtenir un accès de niveau inférieur au contenu ASF, une application doit utiliser les composants ASF de couche WMContainer.

La source multimédia ASF implémente l’interface IMFMediaSource , qui est l’interface générique pour les sources multimédias dans Media Foundation. Comme toute autre source multimédia, la source multimédia ASF fournit un descripteur de présentation qui décrit principalement l’objet d’en-tête ASF. En outre, la source multimédia ASF fournit des descripteurs de flux qui représentent chaque flux dans le contenu multimédia. Pour plus d’informations, consultez la structure de fichiers ASF.

Création de la source multimédia ASF

Pour créer la source multimédia ASF, l’application doit utiliser le programme de résolution de source. Pour créer la source multimédia ASF, l’application doit fournir la source pour laquelle le programme de résolution source crée la source du média ASF. Les informations sources doivent être fournies en spécifiant l’URL du fichier source ou le flux d’octets qui contient le média. Si l’application choisit de créer la source multimédia ASF en spécifiant l’URL, elle doit appeler IMFSourceResolver::CreateObjectFromURL pour l’opération synchrone ou IMFSourceResolver::Begin... EndCreateObjectFromURL pour l’opération asynchrone. Le processus de création de la source multimédia à partir d’un flux d’octets est similaire. L’application doit appeler IMFSourceResolver::CreateObjectFromByteStream pour une opération synchrone ou IMFSourceResolver::Begin... EndCreateObjectFromBytestream pour l’opération asynchrone. Ces appels doivent spécifier MF_RESOLUTION_MEDIASOURCE dans le paramètre dwFlags . Pour plus d’informations sur l’utilisation de cet indicateur, consultez Utilisation du programme de résolution de source.

Si l’application spécifie une URL, pour un fichier local, la chaîne d’URL peut contenir le chemin d’accès du fichier multimédia ou être précédée du « fichier : « scheme ». L’extension de nom de fichier doit être .asf », « .wm », L ».wma », ou « .wmv ». Pour un fichier ASF sur le réseau, le programme de résolution source crée la source réseau, qui utilise la source du média ASF.

Pendant le processus de création d’objet, le programme de résolution source recherche la liste des gestionnaires de schémas et les gestionnaires de flux d’octets dans le Registre système et charge le gestionnaire correspondant le plus proche qui peut analyser le contenu multimédia et créer l’objet source multimédia en dessous. Quelle que soit la méthode utilisée pour créer la source multimédia (URL et flux d’octets), le programme de résolution source crée un flux d’octets et lit le contenu du média source dans le flux d’octets. Pour plus d’informations, consultez Gestionnaires de schémas et gestionnaires Byte-Stream.

Pour obtenir un exemple de code sur la création d’une source multimédia, consultez Utilisation du programme de résolution de source.

Configuration Paramètres pour la source multimédia ASF

Le programme de résolution de source interroge les fonctionnalités du flux d’octets sous-jacent et détermine que les opérations sont autorisées sur la source multimédia nouvellement créée. L’une de ces capacités est à la recherche. Si une opération de recherche est autorisée, l’application peut spécifier le mode de recherche utilisé par la source multimédia lors de la recherche d’un point particulier dans la présentation.

Une application peut définir le mode de recherche, pour que la source multimédia puisse être utilisée, lors de la création de l’objet. Une fois la source multimédia ASF créée avec le mode de recherche spécifié, elle ne peut pas être modifiée sur la source multimédia ou modifiée dynamiquement pendant une présentation. Les préférences de recherche sont spécifiées en tant que propriétés dans l’appel de l’application aux méthodes de résolution de source pertinentes utilisées pour créer la source multimédia. Ces propriétés sont définies dans un magasin de propriétés et transmises au paramètre pProps . Si ces propriétés ne sont pas passées, les fonctions de source multimédia avec les paramètres par défaut. Pour plus d’informations sur la définition de ces propriétés, consultez Configuration d’une source multimédia.

Si la recherche est autorisée, la source multimédia ASF prend en charge les modes de recherche suivants :

  • Recherche exacte : dans ce mode, la source du média ASF s’appuie sur l’objet d’index ASF du fichier ASF. Si le fichier n’a pas l’objet Index, la recherche exacte est désactivée et l’un des autres modes est utilisé en fonction des propriétés spécifiées par l’application définies sur la source multimédia.
  • Recherche approximative : ce mode est demandé par l’application en passant MFPKEY_ASFMediaSource_ApproxSeek dans le magasin de propriétés aux méthodes de résolution source appropriées. Toutefois, la recherche approximative est utilisée uniquement si le flux d’octets ne prend pas en charge la recherche temporelle. Dans ce mode, la source multimédia détermine une heure de début relativement plus proche de l’heure de recherche. Si le fichier ASF contient un objet d’index ASF, il est utilisé pour calculer l’heure de début. La recherche approximative est moins précise, mais plus rapide que la recherche exacte, car le temps pris pour restituer le premier échantillon au moment prédéterminé du début est plus rapide.
  • Recherche itérative : pour définir ce mode, l’application doit définir la propriété MFPKEY_ASFMediaSource_IterativeSeekIfNoIndex . La recherche itérative est un algorithme qui recherche une position dans un fichier ASF qui ne contient aucun objet d’index ASF. Dans ce mode, la source multimédia détermine une estimation approximative du point de recherche en lisant le décalage du flux d’octets. Il utilise une série d’approximations, basées sur le taux de bits moyen, pour se rapprocher progressivement du temps de recherche cible. (L’algorithme est similaire à une recherche binaire.) La recherche itérative peut prendre plus de temps que la recherche à l’aide de l’objet Index. Elle est donc désactivée par défaut. Si vous définissez cette propriété, utilisez les propriétés suivantes pour définir les paramètres de recherche : MFPKEY_ASFMediaSource_IterativeSeek_Max_CountMFPKEY_ASFMediaSource_IterativeSeek_Tolerance_In_MilliSecond. Ces propriétés définissent respectivement le nombre maximal d’itérations et la tolérance. L’algorithme s’arrête lorsqu’il atteint le nombre maximal d’itérations, ou lorsqu’il trouve un paquet dont la distance par rapport au temps de recherche est comprise dans la tolérance spécifiée.

En bref, l’application a la possibilité de choisir une recherche approximative ou itérative lorsque le fichier ASF ne contient pas d’objet d’index ASF.

Modèle objet source de média ASF

La source multimédia ASF implémente l’interface IMFMediaSource et expose les interfaces suivantes. Une application peut obtenir une référence à ces interfaces en appelant IMFMediaSource::QueryInterface sur la source multimédia ASF.

Interface Description
IMFMediaSource Obligatoire pour toutes les sources multimédias.
IMFMediaEventGenerator Obligatoire pour toutes les sources multimédias. Permet aux applications d’obtenir des événements à partir de la source multimédia via la session multimédia.
IMFGetService Interroge la source de média pour l’interface de service spécifiée.
Ipropertystore Définit et obtient des propriétés sur la source multimédia. Chaque propriété contient un nom descriptif et une valeur.
IMFMetadata Décrit les métadonnées du fichier ASF.
IMFMetadataProvider Récupère une collection de métadonnées, soit pour une présentation entière, soit pour un flux dans la présentation.
IMFRateSupport Interroge la plage de taux de lecture pris en charge, y compris la lecture inversée.
IMFRateControl Obtient ou définit le taux de lecture.
IMFTrustedInput Obtient l’ITA pour chacun des flux ASF contenus dans la source.
IMFPMPClient Permet à une source multimédia de recevoir un pointeur vers l’interface IMFPMPHost , qui est utilisée pour créer des objets dans le processus PMP.
IMFTimecodeTranslate Convertit entre les codes de temps society of Motion Picture and Television Engineers (SMPTE) et les unités de temps de 100 nanosecondes.

 

ASF Media Source Services

La source multimédia ASF fournit différents services qui sont étendus au fichier ASF. Pour obtenir un pointeur vers un service particulier, l’application doit utiliser l’un des identificateurs de service suivants dans son appel à MFGetService. Pour plus d’informations, consultez Service Interfaces.

Identificateur du service Description
MF_RATE_CONTROL_SERVICE À l’aide de cet identificateur, une application peut obtenir un pointeur vers les interfaces IMFRateSupport ou IMFRateControl . En utilisant l’objet de prise en charge du débit implémenté par la source multimédia, l’application peut vérifier si un taux particulier est pris en charge par le fichier multimédia ASF sous-jacent obtient également le taux le plus rapide et le plus lent. En utilisant l’objet de contrôle de débit, l’application peut obtenir et définir le taux de lecture. Si l’application spécifie un taux particulier pour la lecture, la source du média ASF vérifie d’abord si le taux demandé est dans les limites de débit (déterminés par les taux les plus rapides et les plus lents), puis définit le taux. Cela ne vérifie pas les conditions variables, car le débit binaire peut changer n’importe quel moment en fonction de la bande passante réseau. Pour plus d’informations, contrôle de débit.
MF_METADATA_PROVIDER_SERVICE À l’aide de cet identificateur, l’application peut obtenir un pointeur vers l’interface IMFMetadataProvider de la source multimédia ASF. Cette interface fournit un accès aux informations sur le fichier ASF, en particulier les objets d’en-tête ASF et les flux contenus dans le contenu multimédia. Les informations d’en-tête sont exposées via les attributs de descripteur de présentation et les informations de flux sont fournies via les attributs de descripteur de flux. Pour plus d’informations sur ces attributs, consultez Attributs Media Foundation pour les objets d’en-tête ASF. Outre les informations exposées par le biais d’attributs, il existe également des métadonnées descriptives, qui sont définies en tant que propriétés.
MF_PROPERTY_HANDLER_SERVICE À l’aide de cet identificateur, l’application peut obtenir un pointeur vers l’interface IPropertyStore de la source de média ASF. Le magasin de propriétés contient toutes les métadonnées liées au fichier ASF. Cet identificateur est nouveau dans Windows 7 et remplace MF_METADATA_PROVIDER_SERVICE pour obtenir des propriétés de métadonnées.
MFNETSOURCE_STATISTICS_SERVICE Pour plus d’informations, consultez Récupération des statistiques réseau dans la journalisation du client.
MF_TIMECODE_SERVICE À l’aide de cet identificateur, l’application peut obtenir un pointeur vers l’interface IMFTimecodeTranslate de la source multimédia. Cette implémentation peut être utilisée pour effectuer des traductions de code de temps telles que la conversion du code de temps SMPTE en unités de 100 nano secondes et de retour.

 

Traduction de code temporel

La source multimédia ASF fournit un service de traduction de code de temps qui permet à votre application de convertir le code de temps SMPTE en heure de présentation la plus proche (en unité de 100 nanosecondes). À l’inverse, l’application peut également obtenir le code d’heure d’une présentation demandée. Le service est disponible via l’interface IMFTimecodeTranslate , que la source multimédia ASF implémente. Les appels de méthode sur ce pointeur d’interface sont asynchrones qui peuvent s’exécuter à partir de votre thread d’application principal sans bloquer l’interface utilisateur de votre application.

Les étapes suivantes résument la procédure de traduction de code temporelle :

  1. Obtenez un pointeur vers l’interface IMFTimecodeTranslate de la source multimédia ASF en appelant MFGetService et en spécifiant l’identificateur MF_TIMECODE_SERVICE .
  2. Appelez IMFTimecodeTranslate::BeginConvertTimecodeToHNS ou IMFTimecodeTranslate::BeginConvertHNSToTimecode et spécifiez l’heure à traduire.. Pour BeginConvertTimecodeToHNS , le code de temps doit être spécifié en tant que variable PROPVARIANT avec VT_I8 type de données. La méthode BeginConvertHNSToTimecode nécessite le temps en unités de 100 nanosecondes comme type MFTIME .
  3. Terminez l’opération asynchrone en appelant IMFTimecodeTranslate::EndConvertTimecodeToHNS ou IMFTimecodeTranslate::EndConvertTimecodeToHNS de manière appropriée.

Lors de la création de la source multimédia, le programme de résolution source crée un flux d’octets pour le fichier à partir duquel la source multimédia lit le contenu ASF. Pour que les conversions de temps réussissent, le flux d’octets associé au fichier ASF doit avoir des fonctionnalités de recherche ; sinon, l’application obtient l’erreur MF_E_BYTESTREAM_NOT_SEEKABLE de l’appel Begin... . Une autre exigence pour les conversions de temps est que le fichier ASF, représenté par la source du média ASF, doit avoir des objets d’index ASF. Les heures de présentation et les codes d’heure sont extraits des objets d’index ASF qui conservent tous les index et les points de recherche correspondants pour le fichier ASF. Pour la traduction de code au moment de la présentation, le fichier ASF doit contenir un objet Index simple ; pour la traduction temporelle du code à présentation, le fichier ASF doit avoir un objet Index. Les opérations de conversion s’appuient sur l’indexeur sous-jacent (composant WMContainer) pour analyser et lire l’objet Index associé au fichier ASF. Si le fichier ne contient pas d’objet Index, l’application reçoit de façon asynchrone le code d’erreur MF_E_NO_INDEX.

Pour traduire l’heure demandée par l’application, la source multimédia énumère les flux dans le fichier et recherche le flux qui contient l’objet d’index ASF approprié. Si un tel flux est trouvé, la source multimédia analyse les paquets ASF du flux jusqu’à ce que le code de temps correct soit atteint. Après avoir trouvé l’exemple correct, il récupère l’heure de présentation correspondante ou le code d’heure de l’exemple et le retourne à l’appelant.

Prise en charge des commandes de script

Lorsque vous générez une topologie ASF qui contient un flux de script, un nœud De flux de script est ajouté à la topologie. Ce nœud envoie des imfSamples au moment approprié. Le IMFSample fourni par le nœud source de script stocke les données dans le IMFMediaBuffer associé à l’exemple. Vous pouvez appeler CopyToBuffer sur l’exemple pour obtenir un IMFMediaBuffer, puis appeler Lock sur la mémoire tampon pour obtenir les données.

Les charges utiles de flux de script sont empaquetées dans la mémoire tampon en tant que chaîne de type, suivie de NULL, suivie de la chaîne de commande, suivie de NULL. Les chaînes sont Unicode au format ASF.

Par exemple, une charge utile peut ressembler à ce qui suit (où \0 indique un caractère NULL) :

URL\0http://contoso.com\0

Text\0This est une légende\0

Composants ASF de couche de pipeline

Prise en charge d’ASF dans Media Foundation