Partilhar via


Amostra de filtro do analisador PSI

[O recurso associado a esta página, DirectShow, é um recurso herdado. Foi substituído por MediaPlayer, IMFMediaEnginee Audio/Video Capture in Media Foundation. Esses recursos foram otimizados para Windows 10 e Windows 11. A Microsoft recomenda vivamente que o novo código utilize MediaPlayer, IMFMediaEngine e Captura de Áudio/Vídeo no Media Foundation em vez de DirectShow, quando possível. A Microsoft sugere que o código existente que usa as APIs herdadas seja reescrito para usar as novas APIs, se possível.]

Descrição

O filtro PSI Parser recebe informações específicas do programa (PSI) de um fluxo de transporte MPEG-2 e extrai informações do programa da tabela de associação de programas (PAT) e tabelas de mapa de programas (PMT). Esta informação permite que uma aplicação configure o MPEG-2 Demultiplexer. O filtro suporta uma interface personalizada, IMpeg2PsiParser, para recuperar as informações PSI.

Este filtro foi concebido para dispositivos MPEG-2, tais como câmaras de vídeo IEEE 1394 MPEG-2 e dispositivos D-VHS. Consulte o Driver MSTape para obter mais informações. As fontes de transmissão de televisão digital devem usar um filtro TIF para obter informações sobre o programa.

Utilização

Você pode testar o filtro do analisador PSI no GraphEdit da seguinte maneira:

  1. Inicie o GraphEdit.

  2. Insira uma fonte de transporte MPEG-2. As câmaras de vídeo MPEG-2 e os dispositivos D-VHS aparecem como "Microsoft AV/C Tape Subunit Device" na categoria Fontes de captura de vídeo.

  3. Conecte o filtro de origem ao filtro MPEG-2 Demultiplexer.

  4. Use a página de propriedades no demux para criar um pino de saída com um tipo de mídia "MPEG-2 PSI". Este pino fornecerá as secções PAT e PMT.

  5. Utilize a página de propriedades do demux para mapear o PID 0x00 para o pino de saída. Defina o tipo de conteúdo como "MPEG2 PSI Sections".

  6. Conecte o pino de saída demux ao PSI Parser, conforme mostrado no diagrama a seguir.

    gráfico de filtro do analisador psi

  7. Execute o gráfico para alimentar o filtro PSI Parser com dados PSI. À medida que o filtro decodifica as secções PAT, mapeia automaticamente os PIDs PMT para o mesmo pino de saída no demux, garantindo assim que receba as secções PMT.

  8. Use a página de propriedades do PSI Parser para selecionar um número de programa. A lista de fluxos elementares na página de propriedades mostrará o PID e o tipo de fluxo associados a cada fluxo elementar no programa selecionado. A página de propriedades foi projetada para reconhecer os tipos de fluxo definidos na ISO/IEC 13818-1.

  9. Digite o número PID de áudio na caixa de edição PID de áudio e o número PID de vídeo na caixa de edição PID de vídeo.

  10. Clique no botão Exibir Programa. O analisador PSI configurará os pinos de saída no demux para corresponder às informações de fluxo do programa e renderizar os pinos.

Observação

A página de propriedades do PSI Parser é fornecida para facilitar o teste e fornecer código de exemplo que configura o MPEG-2 Demultiplexer. Não é recomendado para aplicações de uso. Os aplicativos devem configurar o demux programaticamente.

 

Para usar o filtro PSI Parser em um aplicativo, comece criando o gráfico de filtro da fonte MPEG-2 para o MPEG-2 demux. O código para esta etapa não é mostrado aqui, porque a configuração exata do gráfico dependerá da fonte.

Em seguida, crie um pino de saída no demux para os dados PSI. Mapeie o PID 0x00, que é reservado para as seções PAT, neste pino, conforme mostrado no código a seguir.

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

Para obter mais informações, consulte Usando o MPEG-2 Demultiplexer.

Adicione o filtro PSI Parser ao gráfico e conecte-o ao pino de saída no demux. Consulte o Analisador PSI para a interface IMpeg2PsiParser. Agora, execute o gráfico e aguarde os eventos EC_PROGRAM_CHANGED, que sinalizam uma nova seção PAT ou PMT. Este evento é um evento personalizado definido pelo filtro PSI Parser. Ao receber um evento EC_PROGRAM_CHANGED, pode obter as informações de PSI disponíveis chamando os métodos de IMpeg2PsiParser. Esta seção descreve os métodos que você precisará com mais frequência.

Para obter o número de programas, use o IMpeg2PsiParser::GetCountOfPrograms método:

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

Para obter o número do programa para um programa específico, use o IMpeg2PsiParser::GetRecordProgramNumber método:

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

O número do programa é usado para obter as entradas PMT para programas individuais. Para obter o número de fluxos elementares em um programa, use o GetCountOfElementaryStreams método:

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

Para cada fluxo elementar, o método IMpeg2PsiParser::GetRecordElementaryPid retorna o PID e o método IMpeg2PsiParser::GetRecordStreamType retorna o tipo de fluxo:

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

O PID e o tipo de fluxo permitem configurar novos pinos de saída no MPEG-2 Demultiplexer. Isto pode exigir algum conhecimento da fonte original. Por exemplo, a ISO/IEC 13818-1 define tipos de fluxo 0x80 através de 0xFF como "privados do usuário", mas outros padrões baseados em MPEG-2 podem atribuir outros significados a esses tipos.

O MPEG-2 Demultiplexer pode criar novos pinos e novos mapeamentos PID enquanto o gráfico está em execução, mas você deve parar o gráfico para conectar pinos.

Download do exemplo

Para baixar os exemplos do SDK do DirectShow, instale a versão mais recente do SDK do Windows.

Este exemplo é instalado no seguinte caminho: [SDK Root]\Samples\Multimedia\DirectShow\Filters\PSIParser.

Exemplos do DirectShow

Interface IMpeg2PsiParser