Udostępnij przez


Wyświetlanie napisów zamkniętych

[Funkcja skojarzona z tą stroną, DirectShow, jest starszą funkcją. Został zastąpiony przez MediaPlayer, przez IMFMediaEnginei przez Audio/Video Capture w Media Foundation. Te funkcje zostały zoptymalizowane pod kątem systemów Windows 10 i Windows 11. Firma Microsoft zdecydowanie zaleca, aby nowy kod używał MediaPlayer, IMFMediaEngine i Audio/Video Capture w programie Media Foundation zamiast DirectShow, jeśli to możliwe. Firma Microsoft sugeruje, że istniejący kod, który używa starszych interfejsów API, należy przepisać go do korzystania z nowych interfejsów API, jeśli to możliwe.]

Aby obsługiwać napisy w telewizji analogowej, filtr przechwytywania udostępnia pin, który dostarcza dane VBI lub napisy. Numer PIN będzie miał jedną z następujących kategorii numerów PIN:

  • Pin VBI (PIN_CATEGORY_VBI). Dostarcza strumień przykładów kształtów fal VBI. Są one przekazywane do filtra dekodera, który wyodrębnia dane z napisów dla niesłyszących.
  • Pin CC (PIN_CATEGORY_CC). Dostarcza pary bajtów z napisami kodowanymi, wyodrębnione z danych wiersza 21.
  • Fragmentowanie sprzętu CC pin (PINNAME_VIDEO_CC_CAPTURE).

Aby wyświetlić podgląd napisów zamkniętych, wywołaj ICaptureGraphBuilder2::RenderStream z kategorią pinu VBI, a jeśli to się nie powiedzie, wywołaj ją ponownie z kategorią pinu CC.

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

Na poniższym diagramie przedstawiono typowy wykres filtru do wyświetlania napisów zamkniętych.

graf podglądu napisów

Ten graf używa następujących filtrów do wyświetlania napisów zamkniętych:

  • Trójnik/przejściówka odpływ do odpływu. Akceptuje informacje VBI z filtru przechwytywania i dzieli je na oddzielne strumienie dla każdej usługi danych obecnej na sygnałie. Microsoft udostępnia kodeki VBI dla napisów zamkniętych, NABTS i World Standard Teletext (WST).
  • CC dekoder. Dekoduje dane CC z przepróbkowanych kształtów fal VBI dostarczonych przez filtr przechwytywania.
  • Linia 21 dekodera. Tłumaczy pary bajtów CC i rysuje tekst podpisów na obrazy bitmapowe. Filtr końcowy (w tym przypadku mikser nakładek) nakłada bitmaty na wideo.

Metoda RenderStream narzędzia Capture Graph Builder automatycznie dodaje te filtry. Jeśli filtr przechwytywania ma wyprowadzenie CC zamiast wyprowadzenia VBI, wyprowadzenie CC jest podłączone bezpośrednio do filtra dekodera linii 21.

Notatka

Jeśli do renderowania używasz filtra Video Mixing Renderer (VMR), użyj filtra Line 21 Decoder Filter 2. Ten filtr ma taką samą funkcjonalność jak dekoder liniowy 21, ale identyfikator CLSID jest CLSID_Line21Decoder2.

 

Notatka

Filtr dekodera CC został usunięty w systemie Windows Vista. Nowe aplikacje powinny używać filtru VBICodec, który jest udokumentowany w dokumentacji technologii telewizyjnych firmy Microsoft.

 

Jeśli urządzenie przechwytywania używa portu wideo, filtr przechwytywania może mieć numer PIN VBI portu wideo (PIN_CATEGORY_VIDEOPORT_VBI). Ten PIN musi być połączony z filtrem VBI Surface Allocator, który przydziela powierzchnie do przechowywania przechwyconych danych VBI. Metoda RenderStream dodaje ten filtr, jeśli jest wymagany. Na poniższym diagramie przedstawiono graf filtru z alokatorem powierzchni VBI.

graf podglądu napisów dla niesłyszących z alokatorem powierzchni vbi

Włączanie i wyłączanie podpisów

Aby kontrolować wyświetlanie podpisów, użyj interfejsu IAMLine21Decoder w filtrze Dekoder Line 21. Na przykład można wyłączyć wyświetlanie podpisów przy użyciu metody IAMLine21Decoder::SetServiceState w następujący sposób:

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

W tym przykładzie użyto metody ICaptureGraphBuilder2::FindInterface, aby zlokalizować interfejs IAMLine21Decoder. Pierwszy parametr do FindInterface to &LOOK_DOWNSTREAM_ONLY, który określa wyszukiwanie w dół strumienia, począwszy od filtru przechwytywania (pCap).

Przechwytywanie map bitowych napisów kodowanych

Można zapisać mapy bitowe napisów do pliku. W tym celu dodaj część grafu filtru odpowiedzialną za zapisywanie plików, zgodnie z opisem w Przechwytywanie wideo do pliku. Następnie przypisz pin CC lub VBI do filtra mux.

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

Jeśli przechwytujesz również wideo, spowoduje to utworzenie pliku z dwoma oddzielnymi strumieniami wideo. Nie będzie przechwytywane wideo z napisami nakładanymi na wierzchu obrazu.

Napisy zamknięte i Teletext