Partager via


Filtre d’analyseur SAMI (CC)

[La fonctionnalité associée à cette page, DirectShow, est une fonctionnalité héritée. Il a été remplacé par MediaPlayer, IMFMediaEngineet audio/vidéo capture dans Media Foundation. Ces fonctionnalités ont été optimisées pour Windows 10 et Windows 11. Microsoft recommande vivement que le nouveau code utilise MediaPlayer, IMFMediaEngine et 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.]

Analyse les données de sous-titrage à partir des fichiers SAMI (Synchrond Accessible Media Interchange).

SAMI est un format de texte similaire au format HTML et est utilisé pour l’encodage de légendes basées sur le temps. Ce filtre convertit les données SAMI en flux de texte. Chaque exemple du flux contient une entrée de légende, ainsi que des informations de format. Les horodatages sur les exemples sont générés à partir des informations d’heure dans le fichier SAMI.

Ce filtre est conçu pour être utilisé avec le convertisseur de commandes de script interne filtre. Le renderer de commande de script interne reçoit les exemples de texte et les envoie à l’application, sous la forme de notifications d’événements. Pour plus d’informations, consultez la section Remarques.

Étiquette Valeur
Interfaces de filtre IAMStreamSelect, IBaseFilter
Types de supports de broche d’entrée MEDIATYPE_Stream
Interfaces de broche d’entrée IPin, IQualityControl
Types de supports de broche de sortie MEDIATYPE_Text, MEDIASUBTYPE_NULL
Interfaces de broche de sortie IMediaSeeking , IPin, IQualityControl
Filtrer le CLSID {33FACFE0-A9BE-11D0-A520-00A0D10129C0}
Page de propriétés CLSID Aucune page de propriétés
Exécutable quartz.dll
mérite MERIT_UNLIKELY
catégorie de filtre CLSID_LegacyAmFilterCategory

 

Remarques

Voici un fichier SAMI simple :

<SAMI>
<Head>
<STYLE TYPE="text/css"> <!--
    .ENCC {Name: English; lang:en-US; SAMI_TYPE: CC;}
    .FRCC {Name: French; lang:fr-FR; SAMI_TYPE: CC;}
    #NORMAL {Name: Normal; font-family: arial;}
    #GREENTEXT {Name: GreenText; color:green; font-family: verdana;}
-->
</STYLE>
</Head>
<BODY>
<Sync Start=1000>
    <P CLASS="ENCC">One
    <P CLASS="FRCC">Un

<Sync Start=2000>
    <P CLASS="ENCC">Two
    <P CLASS="FRCC">Deux

<Sync Start=3000>
    <P CLASS="ENCC">Three
    <P CLASS="FRCC">Trois
</BODY>
</SAMI>

La balise STYLE définit deux paramètres de langue, anglais (. ENCC) et français (. FRCC). Il définit également deux styles, #NORMAL et #GREENTEXT. Chaque balise SYNC définit l’heure de début d’une légende, en millisecondes. Les balises P contiennent le texte de légende, tandis que l’attribut CLASS spécifie le paramètre de langue auquel la légende s’applique.

Pour chaque langage et style, le filtre crée un flux logique. À tout moment, un seul flux de langage et un flux de style sont activés. Lorsque le filtre génère un exemple, il sélectionne la légende de la langue actuelle et applique le style actuel. Par défaut, la première langue et le style déclarés dans le fichier sont activés. Une application peut utiliser la méthode IAMStreamSelect ::Enable pour activer un autre flux.

Avec les paramètres par défaut, la première légende dans l’exemple de fichier produit la sortie suivante :

<P STYLE=" Name: English; lang:en-US; SAMI_TYPE: CC; Name: Normal; font-family: arial;">One

Si la sortie est envoyée au renderer de commande de script interne, ce filtre envoie une notification d’événement EC_OLE_EVENT. Le deuxième paramètre d’événement est un BSTR avec le texte de légende. L’application peut récupérer l’événement et afficher la légende.

L’exemple suivant montre comment afficher un fichier SAMI, récupérer des informations de flux, activer des flux et afficher du texte de légende. L’exemple suppose que le fichier SAMI précédent est enregistré en tant que C :\Sami_test_file.sami.

Par souci de concision, cet exemple a utilisé des index de flux codés en dur lorsqu’il appelle la méthode IAMStreamSelect ::Enable. Il effectue également une vérification minimale des erreurs.

void __cdecl main()
{
    HRESULT hr;
    IGraphBuilder *pGraph;
    IMediaControl *pMediaControl;
    IMediaEventEx *pEv;
    IBaseFilter   *pSAMI;

    CoInitialize(NULL);
    
    // Create the filter graph manager.
    CoCreateInstance(CLSID_FilterGraph, NULL, CLSCTX_INPROC, 
                        IID_IGraphBuilder, (void **)&pGraph);
    pGraph->QueryInterface(IID_IMediaControl, (void **)&pMediaControl);
    pGraph->QueryInterface(IID_IMediaEventEx, (void**)&pEv);

    // Create the graph and find the SAMI parser.
    pGraph->RenderFile(L"C:\\Sami_test_file.sami", NULL);
    hr = pGraph->FindFilterByName(L"SAMI (CC) Parser", &pSAMI);
    if (SUCCEEDED(hr)) 
    {
        IAMStreamSelect *pStrm = NULL;
        hr = pSAMI->QueryInterface(IID_IAMStreamSelect, (void**)&pStrm);
        if (SUCCEEDED(hr)) 
        {
            DWORD dwStreams = 0;
            pStrm->Count(&dwStreams);
            printf("Stream count: %d\n", dwStreams);

            // Select French and "GreenText"
            hr = pStrm->Enable(1, AMSTREAMSELECTENABLE_ENABLE);
            hr = pStrm->Enable(3, AMSTREAMSELECTENABLE_ENABLE);

            // Print the name of each logical stream.
            for (DWORD index = 0; index < dwStreams; index++)
            {
                DWORD dwFlags;
                WCHAR *wszName;
                hr = pStrm->Info(index, NULL, &dwFlags, NULL, NULL,
                    &wszName, NULL, NULL);
                if (hr == S_OK)
                {
                    wprintf(L"Stream %d: %s [%s]\n", index, wszName, 
                        (dwFlags ?  L"ENABLED" : L"DISABLED"));
                    CoTaskMemFree(wszName);
                }
            }
            pStrm->Release();
        }
        pSAMI->Release();
    }

    // Run the graph and display the captions.
    pMediaControl->Run();
    while (1)
    {
        long evCode, lParam1, lParam2;
        pEv->GetEvent(&evCode, &lParam1, &lParam2, 100);
        
        if (evCode == EC_OLE_EVENT) {
            wprintf(L"%s\n", (BSTR)lParam2);
        }
        pEv->FreeEventParams(evCode, lParam1, lParam2);

        if (evCode == EC_USERABORT || evCode == EC_COMPLETE || evCode == EC_ERRORABORT)
            break;
    }

    // Clean up.
    pMediaControl->Release();
    pEv->Release();
    pGraph->Release();
    CoUninitialize();
}

Ce filtre utilise l’interface IAsyncReader pour extraire des exemples du filtre source. Par conséquent, il ne prend pas en charge l’interface IMemInputPin sur sa broche d’entrée.

filtres DirectShow