Utilisation des codecs multimédias de fenêtre dans DirectShow
Les objets d’encodeur et de décodeur audio et vidéo Windows Media ont été conçus et optimisés pour fonctionner avec le format de conteneur de fichiers ASF et le Kit de développement logiciel (SDK) au format Windows Media. Les objets codec fonctionnent bien dans DirectShow pour certains scénarios, à savoir le CBR à une seule passe et l’encodage VBR basé sur la qualité des flux vidéo. Toutefois, si vous envisagez d’utiliser les objets de codec directement dans DirectShow à l’aide de conteneurs de fichiers autres qu’ASF, vous devez connaître certains comportements et problèmes à l’avance.
Notes
Si vous envisagez d’utiliser des codecs autonomes avec DirectShow, vous voudrez probablement les utiliser en tant que DMO uniquement. En d’autres termes, vous allez utiliser l’interface IMediaObject au lieu de IMFTransform.
Audio WM dans les fichiers AVI
Vous pouvez utiliser DirectShow pour encoder des flux WMA dans n’importe quel format de conteneur de fichiers pour lequel vous disposez d’un filtre de multiplexeur. Toutefois, les interfaces des codecs Audio et Vidéo Windows Media ne prennent pas en charge WMA dans les fichiers AVI, car il est impossible, à l’aide des filtres de lecture AVI DirectShow par défaut, de maintenir la synchronisation audio-vidéo dans un fichier AVI avec un flux WMA. Pour plus d’informations, consultez Stockage de médias compressés dans des fichiers AVI.
L’encodeur audio DMO génère des exemples de durée variable, même en mode « débit binaire constant ». Il fonctionne donc mieux avec les formats de conteneur de fichiers qui utilisent des horodatages. Les fichiers AVI ne fournissent pas d’horodatage pour chaque exemple audio ou groupe d’exemples. Dans DirectShow, le filtre de fractionnement AVI fabrique des horodatages pour chaque groupe d’échantillons (chaque image audio) en fonction de la valeur nAvgBytesPerSec dans la structure WAVEFORMATEX dans l’en-tête de flux AVI.
L’hypothèse sous-jacente à ce calcul est que tous les échantillons audio dans le flux sont de durée égale ; toutefois, les exemples générés par le DMO ne sont pas de durée égale et les horodatages appliqués par le fractionnement AVI ne sont donc pas exacts. Par conséquent, il n’est pas possible, sans modifier le fractionneur AVI ou le décodeur audio DMO, d’utiliser une application Basée sur DirectShow pour lire des fichiers AVI avec des flux audio et vidéo synchronisés. Le codec Windows Media Audio 9 Voice fonctionnera dans certains cas, mais même cela perdra la synchronisation après toute opération de recherche, de sorte qu’il ne peut vraiment pas être considéré comme une solution viable.
Si vous avez un encodeur MP3, vous pouvez créer des fichiers AVI avec WMV et MP3 pour le flux audio. Ces fichiers sont lus et recherchés correctement dans Lecteur multimédia Windows et d’autres applications DirectShow, car le fractionnement AVI contient un code de gestion spécial pour les flux MP3. Une autre option consiste à utiliser l’audio PCM non compressé, bien que la taille de fichier résultante soit beaucoup plus grande qu’avec un flux audio compressé. Étant donné que l’exemple d’application DirectShow crée des fichiers AVI, il ne montre pas comment utiliser l’encodeur audio DMO.
Encodage en une seule passe
L’encodeur vidéo DMO fonctionne facilement dans DirectShow pour deux modes d’encodage : CBR et VBR basé sur la qualité. Tant que vous suivez l’ordre d’opérations correct lors de la création du graphe de filtre, comme illustré dans l’exemple d’application, il est relativement simple de placer du contenu WMV dans un fichier AVI à l’aide du multiplexeur AVI et de l’enregistreur de fichiers.
Encodage à deux passes
Les modes d’encodage à deux passes nécessitent une approche plus complexe de la création et de la diffusion en continu de graphiques afin d’empêcher le DMO de vider son contenu à partir de la première passe avant de commencer la deuxième passe. Dans l’encodage à deux étapes, il est nécessaire d’exécuter le graphe une fois afin que le DMO puisse effectuer son analyse de prétraitement des données de fichier, puis rembobiner le graphe et l’exécuter à nouveau afin que le DMO puisse effectuer l’encodage réel.
Lorsque le graphe passe à un état d’exécution pour le deuxième passage, le wrapper DMO définit l’indicateur DISCONTINUITY sur le premier exemple, car l’horodatage n’est pas séquentiel avec le dernier horodatage sur le premier passage. Lorsque le DMO, qui n’a pas été conçu pour fonctionner dans DirectShow de cette façon, reçoit l’indicateur DISCONTINUITY, il effectue un vidage et perd les données stockées à partir de la première passe. Pour contourner ce problème, la meilleure solution consiste probablement à écrire un filtre wrapper DMO personnalisé qui ne définit pas l’indicateur DISCONTINUITY lorsque le graphique est recherché après la première passe. L’exemple Vidéo pour Windows (VfW) de ce KIT de développement logiciel (SDK) montre comment effectuer un encodage en deux étapes.
Contenu entrelacé
L’encodeur WMV DMO est capable d’encoder du contenu entrelacé tout en préservant l’entrelacement, ce qui est utile pour le contenu capturé à partir d’un téléviseur et qui peut également être lu sur un téléviseur. Toutefois, il n’est pas possible de conserver l’entrelacement à l’aide du wrapper DMO par défaut, car ce filtre ne prend pas en charge INSSBuffer sur ses exemples d’entrée.
Le DMO utilise cette interface pour obtenir les paramètres entrelacés pour chaque exemple qu’il reçoit. Si l’interface est introuvable, comme c’est le cas avec le wrapper DMO, le DMO traite simplement les exemples d’entrée comme non entrelacés. Pour effectuer un encodage entrelacé dans DirectShow, il existe plusieurs alternatives. L’approche la plus simple consiste probablement à utiliser le Kit de développement logiciel (SDK) Windows Media Format 9 Série 9, soit directement, soit à l’aide du filtre WM ASF Writer DirectShow, pour créer un fichier ASF entrelacé. Vous pouvez ensuite transcoder ce fichier dans un autre format. Si vous transcodez en AVI, vous aurez un fichier entrelacé, mais les filtres de lecture AVI DirectShow standard ne le reconnaîtront pas comme tel, car ils ne prennent pas en charge VIDEOINFOHEADER2. Une autre approche consiste à écrire votre propre filtre Wrapper DMO qui prend en charge l’interface INSSBuffer .
Rubriques connexes