Поделиться через


Просмотр закрытых подписей

[Функция, связанная с этой страницей, DirectShow, является устаревшей функцией. Он был заменен MediaPlayer, IMFMediaEngineи аудио и видеозахват в Media Foundation. Эти функции оптимизированы для Windows 10 и Windows 11. Корпорация Майкрософт настоятельно рекомендует, по возможности, использовать новый код MediaPlayer, IMFMediaEngine и аудио/видеозахват в Media Foundation вместо DirectShow. Корпорация Майкрософт предлагает, что существующий код, использующий устаревшие API, будет перезаписан для использования новых API, если это возможно.]

Для поддержки закрытых подписей в аналоговом телевидении фильтр записи предоставляет пин-код, который предоставляет данные VBI или закрытых субтитров. Пин будет иметь одну из следующих категорий:

  • Закрепление контакта VBI (PIN_CATEGORY_VBI). Предоставляет поток примеров волн VBI. Они передаются в фильтр декодировщика, который извлекает закрытые данные субтитров.
  • Пин CC (PIN_CATEGORY_CC). Предоставляет пары байтов закрытого заголовка, извлеченные из данных line-21.
  • Аппаратное сегментирование контактного пина CC (PINNAME_VIDEO_CC_CAPTURE).

Чтобы просмотреть закрытые субтитры, вызовите ICaptureGraphBuilder2::RenderStream с категорией пина VBI, а если это не удалось, вызовите его снова с категорией CC.

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

На следующей схеме показан типичный график фильтров для отображения закрытых подписей.

схема предварительного просмотра закрытых субтитров

На этом графе используются следующие фильтры для отображения закрытого заголовка:

  • преобразователь Tee/Sink-to-Sink. Принимает информацию VBI из фильтра захвата и разбивает её на отдельные потоки для каждой из служб данных, присутствующих в сигнале. Корпорация Майкрософт предоставляет видео кодеки VBI для скрытых субтитров, NABTS и Всемирного стандарта телетекста (WST).
  • декодер CC. Декодирует данные CC из отсэмплированных форм волн VBI, предоставляемых фильтром захвата.
  • В декодере строка 21. Преобразует пары байтов CC и рисует текст подписи на растровые изображения. Нижний фильтр (в данном случае миксер наложений) накладывает изображения на видео.

Метод RenderStream сборщика графов записи автоматически добавляет эти фильтры. Если в фильтре захвата имеется контакт CC вместо контакта VBI, контакт CC подключается непосредственно к фильтру декодера Line 21.

Заметка

Если вы используете фильтр видеомикшера (VMR) для отрисовки, используйте фильтр декодировщика строки 21. Этот фильтр имеет те же функциональные возможности, что и декодер Строки 21, но его CLSID — CLSID_Line21Decoder2.

 

Заметка

Фильтр декодера CC был удален в Windows Vista. Новые приложения должны использовать фильтр VBICodec, который описан в документации по технологиям Microsoft TV.

 

Если устройство записи использует видеопорт, фильтр записи может иметь вывод VBI видеопорта (PIN_CATEGORY_VIDEOPORT_VBI). Этот пин должен быть подключен к фильтру VBI Surface Allocator, который выделяет поверхности для хранения захваченных данных VBI. Метод RenderStream добавляет этот фильтр, если это необходимо. На следующей схеме показан граф фильтров с помощью VBI Surface Allocator.

граф предварительного просмотра закрытых субтитров с распределителем ресурсов поверхности VBI

Включение и отключение подписей

Чтобы управлять отображением заголовков, используйте интерфейс IAMLine21Decoder в фильтре декодера Line 21. Например, можно отключить отображение заголовков с помощью метода IAMLine21Decoder::SetServiceState следующим образом:

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

В этом примере используется метод ICaptureGraphBuilder2::FindInterface для поиска интерфейса IAMLine21Decoder. Первый параметр в FindInterface&LOOK_DOWNSTREAM_ONLY, который указывает искать ниже по потоку от фильтра захвата (pCap).

Запись растровых изображений закрытого заголовка

Вы можете записать растровые изображения заголовков в файл. Для этого добавьте раздел записи в файл графа фильтров, как описано в разделе Захват видео в файл. Затем подключите пин CC или VBI к фильтру мультиплексора.

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

Если вы также записываете видео, это создаст файл с двумя отдельными видеопотоками. Он не будет записывать видео с подписями, наложенными на вершину рисунка.

Закрытые субтитры и Телетекст