Пример фильтра синтаксического анализа PSI

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

Описание

Фильтр анализатора PSI получает сведения о конкретных программах (PSI) из транспортного потока MPEG-2 и извлекает сведения о программе из таблицы ассоциаций программ (PAT) и таблиц карт программы (PMT). Эта информация позволяет приложению настроить MPEG-2 Demultiplexer. Фильтр поддерживает кастомный интерфейс, IMpeg2PsiParserдля получения информации о PSI.

Этот фильтр предназначен для устройств MPEG-2, таких как видеокамеры IEEE 1394 MPEG-2 и устройства D-VHS. Для получения дополнительной информации см. «MSTape Driver». Источники цифрового телевещания должны использовать фильтр TIF для получения сведений о программе.

Употребление

Вы можете протестировать фильтр анализатора PSI в GraphEdit следующим образом:

  1. Запустите GraphEdit.

  2. Вставьте транспортный источник MPEG-2. Камкордеры MPEG-2 и устройства D-VHS отображаются как "Устройство подсоединений ленты Microsoft AV/C" в категории "Источники записи видео".

  3. Подключите исходный фильтр к фильтру MPEG-2 Demultiplexer.

  4. Используйте страницу свойств в демуксе, чтобы создать выходной пин-код с типом носителя MPEG-2 PSI. Этот пин-код будет доставлять разделы PAT и PMT.

  5. Используйте страницу свойств demux, чтобы сопоставить PID 0x00 с выходным пином. Задайте для типа контента значение MPEG2 PSI Sections.

  6. Подключите выходной пин demux к анализатору PSI, как показано в следующей схеме.

    граф парсера фильтрации psi

  7. Запустите граф, чтобы передать данные PSI в фильтр парсера PSI. По мере того как фильтр декодирует разделы PAT, он автоматически сопоставляет PID PMT с тем же выходным контактом на демультиплексоре для получения разделов PMT.

  8. Используйте страницу свойств анализатора PSI, чтобы выбрать номер программы. В списке элементарных потоков на странице свойств будет отображаться PID и тип потока, связанные с каждым элементарным потоком в выбранной программе. Страница свойств предназначена для распознавания типов потоков, определенных в ISO/IEC 13818-1.

  9. Введите номер аудио PID в поле редактирования Audio PID и номер видео PID в поле редактирования Video PID.

  10. Нажмите кнопку Просмотреть программу. Средство синтаксического анализа PSI настроит выходные пин-коды в демуксе, чтобы сопоставить сведения о потоке программы и отобразить пин-коды.

Заметка

Страница свойств PSI Parser предоставляется для упрощения тестирования и предоставления примера кода, который настраивает MPEG-2 Demultiplexer. Не рекомендуется использовать для приложений. Приложения должны программно настроить демукс.

 

Чтобы использовать фильтр анализатора PSI в приложении, начните с создания графа фильтров от источника MPEG-2 к демультиплексору MPEG-2. Код для этого шага не представлен здесь, так как точная конфигурация графа зависит от источника.

Затем создайте выходной контакт в демультиплексоре для данных PSI. Сопоставьте PID 0x00, зарезервированный для разделов PAT, с этим контактом, как показано в следующем коде:

// Set the media type to MPEG-2 table sections.
AM_MEDIA_TYPE mt;
ZeroMemory(&mt, sizeof(AM_MEDIA_TYPE));
mt.majortype = KSDATAFORMAT_TYPE_MPEG2_SECTIONS;

// Create the pin.
IPin *pPsiPin;
hr = pDemux->CreateOutputPin(&mt, L"PSI", &pPsiPin);
if (SUCCEEDED(hr))
{
    // Map to PID 0.
    ULONG Pid = 0x00;
    hr = pPid->MapPID(1, &Pid, MEDIA_MPEG2_PSI);
}

Дополнительные сведения см. в разделе "Использование демультиплексора MPEG-2".

Добавьте фильтр синтаксического анализа PSI в граф и подключите его к выходному разъёму демультиплексора. Запросите парсер PSI для интерфейса IMpeg2PsiParser. Теперь запустите граф и дождитесь событий EC_PROGRAM_CHANGED, которые сигнализируют о новой секции PAT или PMT. Это событие является пользовательским событием, определенным фильтром парсера PSI. При получении события EC_PROGRAM_CHANGED можно получить доступную информацию PSI, вызвав методы IMpeg2PsiParser. В этом разделе описываются наиболее часто необходимые методы.

Чтобы получить количество программ, используйте метод IMpeg2PsiParser::GetCountOfPrograms:

int NumProgs = 0;
hr = pPsi->GetCountOfPrograms(&NumProgs);

Чтобы получить номер программы для конкретной программы, используйте метод IMpeg2PsiParser::GetRecordProgramNumber:

WORD ProgNum = 0;
for (int i = 0; i < NumProgs; i++)
{
    hr = pPsi->GetRecordProgramNumber(i, &ProgNum);
    ...
}

Номер программы используется для получения записей PMT для отдельных программ. Чтобы получить количество простых потоков в программе, используйте метод GetCountOfElementaryStreams:

WORD cElemStreams = 0;
hr = pPsi->GetCountOfElementaryStreams(ProgNum, &cElemStreams);

Для каждого элементарного потока метод IMpeg2PsiParser::GetRecordElementaryPid возвращает идентификатор PID, а метод IMpeg2PsiParser::GetRecordStreamType возвращает тип потока:

BYTE ESType = 0;
WORD ESPid = 0;
for (WORD j = 0; j < cElemStreams; j++)
{
    hr = pPsi->GetRecordElementaryPid(ProgNum, j, &ESPid);
    hr = pPsi->GetRecordStreamType(ProgNum, j, &ESType);
}

PID и тип потока позволяют вам настроить новые выходные выводы MPEG-2 Demultiplexer. Это может потребовать некоторых знаний о исходном источнике. Например, ISO/IEC 13818-1 определяет типы потоков 0x80 через 0xFF как "частный пользователь", но другие стандарты, основанные на MPEG-2, могут назначать другие значения этим типам.

Демульплексер MPEG-2 может создавать новые пин-коды и новые сопоставления PID во время работы графа, но необходимо остановить граф для подключения контактов.

Скачивание примера

Чтобы скачать примеры пакета SDK DirectShow, установите последнюю версию пакета SDK для Windows.

Этот пример устанавливается по следующему пути: [корневой каталог SDK]\Samples\Multimedia\DirectShow\Filters\PSIParser.

Примеры DirectShow

интерфейс IMpeg2PsiParser