Partager via


Filtre de l’analyseur SAMI (CC)

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

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

SAMI est un format de texte similaire à HTML et est utilisé pour encoder les 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 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 filtre Renderer de commande de script interne . Le convertisseur de commandes de script interne reçoit les exemples de texte et les envoie à l’application, sous forme de notifications d’événements. Pour plus d'informations, consultez la section Notes.

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

 

Notes

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, l’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’un légende, en millisecondes. Les balises P contiennent le texte légende, tandis que l’attribut CLASS spécifie le paramètre de langue auquel s’applique le légende.

Pour chaque langage et style, le filtre crée un flux logique. À tout moment, un seul flux de langue et un flux de style sont activés. Lorsque le filtre génère un exemple, il sélectionne le légende pour 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 légende. L’application peut récupérer l’événement et afficher le légende.

L’exemple suivant montre comment restituer un fichier SAMI, récupérer des informations de flux, activer des flux et afficher légende texte. 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