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:
Inicie o GraphEdit.
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.
Conecte o filtro de origem ao filtro MPEG-2 Demultiplexer.
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.
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".
Conecte o pino de saída de demux ao Analisador psi, conforme mostrado no diagrama a seguir.
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.
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.
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 .
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.
Tópicos relacionados