Filter Pengurai SAMI (CC)

[Fitur yang terkait dengan halaman ini, DirectShow, adalah fitur warisan. Ini telah digantikan oleh MediaPlayer, IMFMediaEngine, dan Pengambilan Audio/Video di Media Foundation. Fitur-fitur tersebut telah dioptimalkan untuk Windows 10 dan Windows 11. Microsoft sangat menyarankan agar kode baru menggunakan MediaPlayer, IMFMediaEngine , dan Pengambilan Audio/Video di Media Foundation alih-alih DirectShow, jika memungkinkan. Microsoft menyarankan agar kode yang ada yang menggunakan API warisan ditulis ulang untuk menggunakan API baru jika memungkinkan.]

Mengurai data keterangan dari file Synchronized Accessible Media Interchange (SAMI).

SAMI adalah format teks yang mirip dengan HTML, dan digunakan untuk pengodean keterangan berbasis waktu. Filter ini mengonversi data SAMI menjadi aliran teks. Setiap sampel dalam aliran berisi satu entri caption, bersama dengan informasi format. Stempel waktu pada sampel dihasilkan dari informasi waktu dalam file SAMI.

Filter ini dirancang untuk digunakan dengan filter Perender Perintah Skrip Internal . Perender Perintah Skrip Internal menerima sampel teks dan mengirimkannya ke aplikasi, dalam bentuk pemberitahuan peristiwa. Untuk informasi lebih lanjut, lihat bagian Keterangan.

Label Nilai
Antarmuka Filter IAMStreamSelect, IBaseFilter
Jenis Media Pin Input MEDIATYPE_Stream
Antarmuka Pin Input IPin, IQualityControl
Tipe Media Pin Output MEDIATYPE_Text, MEDIASUBTYPE_NULL
Antarmuka Pin Output IMediaSeeking, IPin, IQualityControl
Filter CLSID {33FACFE0-A9BE-11D0-A520-00A0D10129C0}
CLSID Halaman Properti Tidak ada halaman properti
Eksekusi quartz.dll
Merit MERIT_UNLIKELY
Kategori Filter CLSID_LegacyAmFilterCategory

 

Keterangan

Berikut ini adalah file SAMI sederhana:

<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>

Tag STYLE mendefinisikan dua pengaturan bahasa, Bahasa Inggris (. ENCC) dan Prancis (. FRCC). Ini juga mendefinisikan dua gaya, #NORMAL dan #GREENTEXT. Setiap tag SYNC menentukan waktu mulai untuk caption, dalam milidetik. Tag P berisi teks caption, sementara atribut CLASS menentukan pengaturan bahasa yang diterapkan caption.

Untuk setiap bahasa dan gaya, filter membuat aliran logis. Kapan saja, tepat satu aliran bahasa dan satu aliran gaya diaktifkan. Saat filter menghasilkan sampel, filter memilih caption untuk bahasa saat ini dan menerapkan gaya saat ini. Secara default, bahasa dan gaya pertama yang dideklarasikan dalam file diaktifkan. Aplikasi dapat menggunakan metode IAMStreamSelect::Enable untuk mengaktifkan aliran yang berbeda.

Dengan pengaturan default, caption pertama dalam file contoh menghasilkan output berikut:

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

Jika output masuk ke Perender Perintah Skrip Internal, filter tersebut mengirimkan pemberitahuan peristiwa EC_OLE_EVENT . Parameter peristiwa kedua adalah BSTR dengan teks caption. Aplikasi dapat mengambil peristiwa dan menampilkan caption.

Contoh berikut menunjukkan cara merender file SAMI, mengambil informasi aliran, mengaktifkan aliran, dan menampilkan teks caption. Contoh mengasumsikan bahwa file SAMI sebelumnya disimpan sebagai C:\Sami_test_file.sami.

Untuk keringkasan, contoh ini menggunakan indeks aliran yang dikodekan secara permanen saat memanggil metode IAMStreamSelect::Enable . Ini juga melakukan pemeriksaan kesalahan minimal.

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();
}

Filter ini menggunakan antarmuka IAsyncReader untuk menarik sampel dari filter sumber. Oleh karena itu, ia tidak mendukung antarmuka IMemInputPin pada pin inputnya.

Filter DirectShow