Affichage du télétexte world standard
[La fonctionnalité associée à cette page, DirectShow, est une fonctionnalité héritée. Il a été remplacé par MediaPlayer, IMFMediaEngine et Audio/Video Capture dans Media Foundation. Ces fonctionnalités ont été optimisées pour Windows 10 et Windows 11. Microsoft recommande vivement au nouveau code d’utiliser MediaPlayer, IMFMediaEngine et La capture audio/vidéo dans Media Foundation au lieu de DirectShow, lorsque cela est possible. Microsoft suggère que le code existant qui utilise les API héritées soit réécrit pour utiliser les nouvelles API si possible.]
Notes
Cette fonctionnalité a été supprimée de Windows Vista et des systèmes d’exploitation ultérieurs. Il est disponible pour une utilisation dans les systèmes d’exploitation Microsoft Windows 2000, Windows XP et Windows Server 2003.
WST (World Standard Teletext) est encodé dans l’intervalle de remplissage vertical (VBI) du signal de télévision analogique. Le graphe de filtre pour l’aperçu du télétexte est similaire au graphe utilisé pour afficher les sous-titres. Le diagramme suivant illustre ce graphique.
Ce graphique utilise les filtres suivants pour l’affichage WST :
- Convertisseur de tee/récepteur à récepteur. Accepte les informations VBI du filtre de capture et les fractionne en flux distincts pour chacun des services de données présents sur le signal.
- Codec WST. Décode les données de télétexte à partir des exemples VBI.
- Décodeur WST. Traduit les données de télétexte et dessine le texte dans des bitmaps. Le filtre en aval (dans ce cas, le mélangeur de superposition) superpose les bitmaps sur la vidéo.
La méthode RenderStream de Capture Graph Builder ne prend pas en charge directement les filtres WST. Votre application doit donc effectuer un travail supplémentaire.
Ajoutez le filtre Overlay Mixer au graphique de filtre. Le code suivant utilise la fonction AddFilterByCLSID décrite dans Ajouter un filtre par CLSID. (AddFilterByCLSID n’est pas une API DirectShow.)
IBaseFilter *pOvMix = NULL; // Pointer to the Overlay Mixer filter. hr = AddFilterByCLSID(pGraph, CLSID_OverlayMixer, L"OVMix", &pOvMix); if (FAILED(hr)) { // Handle the error ... }
Connectez l’épingle d’aperçu au filtre Video Renderer via le mélangeur de superposition. Vous pouvez utiliser la méthode RenderStream , comme suit :
hr = pBuild->RenderStream(&PIN_CATEGORY_PREVIEW, &MEDIATYPE_Video, pCap, pOvMix, 0);
Ajoutez le filtre Tee/Sink-to-Sink Converter au graphique de filtre. Le code suivant utilise la fonction CreateKernelFilter décrite dans Création de filtres Kernel-Mode. (CreateKernelFilter n’est pas une API DirectShow.)
IBaseFilter* pKernelTee = NULL; hr = CreateKernelFilter(AM_KSCATEGORY_SPLITTER, OLESTR("Tee/Sink-to-Sink Converter"), &pKernelTee); if (SUCCEEDED(hr)) { hr = pGraph->AddFilter(pKernelTee, L"Kernel Tee"); }
Ajoutez le filtre de codec WST au graphique de filtre :
IBaseFilter* pWstCodec = NULL; hr = CreateKernelFilter(AM_KSCATEGORY_VBICODEC, OLESTR("WST Codec"), &pWstCodec); if (SUCCEEDED(hr)) { hr = pGraph->AddFilter(pWstCodec, L"WST Codec"); }
Appelez RenderStream pour connecter la broche VBI du filtre de capture au convertisseur Tee/Sink-to-Sink et le convertisseur Tee/Sink-to-Sink au filtre du codec WST :
hr = pBuild->RenderStream(&PIN_CATEGORY_VBI, 0, pCap, pKernelTee, pWstCodec);
Appelez à nouveau RenderStream pour connecter le filtre du codec WST au mélangeur de superposition. Le filtre Décodeur WST est automatiquement introduit dans le graphique.
hr = pBuild->RenderStream(0, 0, pWstCodec, 0, pOvMix);
N’oubliez pas de libérer toutes les interfaces de filtre.
pOvMix->Release(); pKernelTee->Release(); pWstCodec->Release();
Remarque
Actuellement, le filtre Décodeur WST ne prend pas en charge les connexions au filtre VMR (Video Mix Renderer). Par conséquent, vous devez utiliser le filtre Video Renderer hérité pour afficher le télétexte.
Si le filtre de capture a une broche VBI de port vidéo (PIN_CATEGPORY_VIDEOPORT_VBI), connectez-le au filtre Surface Allocator VBI . Sinon, le graphique ne s’exécutera pas correctement. L’exemple de code suivant utilise la fonction AddFilterByCLSID, décrite dans Ajouter un filtre par CLSID, et la fonction FindPinByCategory, décrite dans Utilisation des catégories pin. (Aucune des fonctions n’est une API DirectShow.)
// Look for a video port VBI pin on the capture filter.
IPin *pVPVBI = NULL;
hr = FindPinByCategory(pCap, PINDIR_OUTPUT,
PIN_CATEGORY_VIDEOPORT_VBI, &pVPVBI);
if (FAILED(hr))
{
// No video port VBI pin; nothing else to do. OK to run the graph.
}
else
{
// Found one. Connect it to the VBI Surface Allocator.
IBaseFilter *pSurf = NULL;
hr = AddFilterByCLSID(pGraph, CLSID_VBISurfaces, L"VBI Surf", &pSurf);
if (SUCCEEDED(hr))
{
hr = pBuild->RenderStream(NULL, NULL, pVPVBI, 0, pSurf);
pSurf->Release();
}
if (FAILED(hr))
{
// Handle the error (not shown). It is probably not safe to
// run the graph at this point.
}
pVPVBI->Release();
}
Rubriques connexes