Affichage des sous-titres

[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.]

Pour prendre en charge les sous-titres dans la télévision analogique, le filtre de capture expose une broche qui fournit des données VBI ou fermées légende. L’épingle aura l’une des catégories de broches suivantes :

  • Broche VBI (PIN_CATEGORY_VBI). Fournit un flux d’exemples de forme d’onde VBI. Celles-ci sont transmises à un filtre de décodeur qui extrait les données de sous-titrage.
  • Broche CC (PIN_CATEGORY_CC). Fournit des paires d’octets légende fermées, extraites des données de la ligne 21.
  • Broche CC de découpage matériel (PINNAME_VIDEO_CC_CAPTURE).

Pour afficher un aperçu des sous-titres, appelez ICaptureGraphBuilder2::RenderStream avec la catégorie de broche VBI et, si cela échoue, appelez-le à nouveau avec la catégorie CC.

hr = pBuild->RenderStream(&PIN_CATEGORY_VBI, 0, pCap, 0, 0);
if (FAILED(hr))
{
    hr = pBuild->RenderStream(&PIN_CATEGORY_CC, 0, pCap, 0, 0);
}

Le diagramme suivant montre un graphique de filtre classique pour l’affichage des sous-titres.

Graphe en préversion du sous-titrage

Ce graphique utilise les filtres suivants pour l’affichage des légende fermés :

  • 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. Microsoft fournit des codecs VBI pour les sous-titres, NABTS et WST (World Standard Teletext).
  • Décodeur CC. Décode les données CC des formes d’onde VBI échantillonnées fournies par le filtre de capture.
  • Décodeur ligne 21. Traduit les paires d’octets CC et dessine le texte légende en 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 ajoute automatiquement ces filtres. Si le filtre de capture a une broche CC au lieu d’une broche VBI, la broche CC est connectée directement au filtre Décodeur ligne 21.

Notes

Si vous utilisez le filtre Video Mixing Renderer (VMR) pour le rendu, utilisez le filtre de décodeur ligne 21 2. Ce filtre a les mêmes fonctionnalités que le décodeur de ligne 21, mais le CLSID est CLSID_Line21Decoder2.

 

Remarque

Le filtre CC Décodeur a été supprimé dans Windows Vista. Les nouvelles applications doivent utiliser le filtre VBICodec, qui est documenté dans la documentation microsoft TV Technologies.

 

Si l’appareil de capture utilise un port vidéo, le filtre de capture peut avoir une broche VBI de port vidéo (PIN_CATEGORY_VIDEOPORT_VBI). Cette broche doit être connectée au filtre VBI Surface Allocator , qui alloue des surfaces pour contenir les données VBI capturées. La méthode RenderStream ajoute ce filtre si nécessaire. Le diagramme suivant montre un graphique de filtre avec l’allocateur Surface VBI.

Graphe en préversion du sous-titrage avec l’allocation de surface vbi

Activation et désactivation des sous-titres

Pour contrôler l’affichage du sous-titrage, utilisez l’interface IAMLine21Decoder sur le filtre Décodeur ligne 21. Par exemple, vous pouvez désactiver l’affichage du sous-titrage à l’aide de la méthode IAMLine21Decoder::SetServiceState , comme suit :

// Use the FindInterface method to find the interface.
IAMLine21Decoder *pLine21 = NULL;
hr = pBuild->FindInterface(
    &LOOK_DOWNSTREAM_ONLY, // Look downstream from pCap 
    NULL,                  // No particular media type
    pCap,                  // Pointer to the capture filter.
    IID_IAMLine21Decoder, (void**)&pLine21);
if (SUCCEEDED(hr))
{
    pLine21->SetServiceState(AM_L21_CCSTATE_Off);
    // (Use AM_L21_CCSTATE_On to enable.)
    pLine21->Release();
}

Cet exemple utilise la méthode ICaptureGraphBuilder2::FindInterface pour localiser l’interface IAMLine21Decoder . Le premier paramètre de FindInterface est &LOOK_DOWNSTREAM_ONLY, qui spécifie la recherche en aval à partir du filtre de capture (pCap).

Capture de bitmaps de sous-titres codés

Vous pouvez capturer les légende bitmaps dans un fichier. Pour ce faire, ajoutez la section d’écriture de fichier du graphique de filtre, comme décrit dans Capture vidéo dans un fichier. Restituez ensuite la broche CC ou VBI au filtre mux :

hr = pBuild->RenderStream(&PIN_CATEGORY_VBI, 0, pCap, 0, pMux);
if (FAILED(hr))
{
    hr = pBuild->RenderStream(&PIN_CATEGORY_CC, 0, pCap, 0, pMux);
}

Si vous capturez également la vidéo, cela crée un fichier avec deux flux vidéo distincts. Il ne capture pas la vidéo avec des légendes superposées sur l’image.

Sous-titres et télétexte