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


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

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

Описание

Фильтр средства синтаксического анализа PSI получает сведения о программе (PSI) из транспортного потока MPEG-2 и извлекает сведения о программе из таблицы ассоциаций программ (PAT) и таблиц карт программ (PMT). Эти сведения позволяют приложению настроить demultiplexer MPEG-2. Фильтр поддерживает пользовательский интерфейс 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.

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

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

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

    Граф фильтра средства синтаксического анализа psi

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

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

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

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

Примечание

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

 

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

Затем создайте выходную закрепку на demux для данных PSI. Сопоставьте 0x00 PID, зарезервированные для разделов 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. Для этого может потребоваться некоторое знание исходного источника. Например, ISO/IEC 13818-1 определяет типы потоков 0x80 через 0xFF как "пользовательские частные", но другие стандарты, основанные на MPEG-2, могут присваивать этим типам другие значения.

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

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

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

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

Примеры DirectShow

Интерфейс IMpeg2PsiParser