Compartilhar via


Amostra de filtro do analisador psi

[O recurso associado a esta página, DirectShow, é um recurso herdado. Foi substituído por MediaPlayer, IMFMediaEngine e Audio/Video Capture in Media Foundation. Esses recursos foram otimizados para Windows 10 e Windows 11. A Microsoft recomenda fortemente que o novo código use MediaPlayer, IMFMediaEngine e Audio/Video Capture in 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 analisador psi recebe informações específicas do programa (PSI) de um fluxo de transporte MPEG-2 e extrai informações do programa da PAT (Tabela de Associação de Programas) e tabelas de mapa do programa (PMT). Essas informações permitem que um aplicativo configure o Demultiplexer MPEG-2. O filtro dá suporte a uma interface personalizada, IMpeg2PsiParser, para recuperar as informações da PSI.

Esse filtro foi projetado para dispositivos MPEG-2, como câmeras IEEE 1394 MPEG-2 e dispositivos D-VHS. Confira 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 do programa.

Uso

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

  1. Inicie o GraphEdit.

  2. Insira uma fonte de transporte MPEG-2. As câmeras MPEG-2 e os dispositivos D-VHS aparecem como "Dispositivo de Subunidade de Fita do Microsoft AV/C" 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 pin de saída com um tipo de mídia "MPEG-2 PSI". Esse pino entregará as seções PAT e PMT.

  5. Use 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 "Seções DO PSI MPEG2".

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

    grafo de filtro do analisador psi

  7. Execute o grafo para alimentar os dados da PSI para o filtro analisador psi. Como o filtro decodifica as seções pat, ele mapeia automaticamente os PIDs do PMT para o mesmo pino de saída no demux, para que ele receba as seções pmt.

  8. Use a página de propriedades do Analisador psi para selecionar um número de programa. A lista de fluxo elementar 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 tipos de fluxo definidos em ISO/IEC 13818-1.

  9. Insira 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 Analisador psi é fornecida para facilitar o teste e fornecer código de exemplo que configura o Demultiplexer MPEG-2. Não é recomendável que os aplicativos usem. Os aplicativos devem configurar o demux programaticamente.

 

Para usar o filtro analisador psi em um aplicativo, comece criando o grafo de filtro da origem MPEG-2 para o demux MPEG-2. O código para esta etapa não é mostrado aqui, pois a configuração exata do grafo dependerá da origem.

Em seguida, crie um pino de saída no demux para os dados da PSI. Mapeie o PID 0x00, que é reservado para seções PAT, para esse 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 Demultiplexer MPEG-2.

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

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

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

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

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 de PMT para programas individuais. Para obter o número de fluxos elementares em um programa, use o método GetCountOfElementaryStreams :

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 que você configure novos pinos de saída no Demultiplexer MPEG-2. Isso pode exigir algum conhecimento da fonte original. Por exemplo, ISO/IEC 13818-1 define tipos de fluxo 0x80 por meio de 0xFF como "usuário privado", mas outros padrões baseados em MPEG-2 podem atribuir outros significados a esses tipos.

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

Baixar o 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: [Raiz do SDK]\Samples\Multimedia\DirectShow\Filters\PSIParser.

Exemplos do DirectShow

IMpeg2PsiParser Interface