Compartir a través de


Ejemplo de filtro del analizador de PSI

[La característica asociada a esta página, DirectShow, es una característica heredada. Se ha reemplazado por MediaPlayer, IMFMediaEngine y Captura de audio/vídeo en Media Foundation. Esas características se han optimizado para Windows 10 y Windows 11. Microsoft recomienda encarecidamente que el nuevo código use MediaPlayer, IMFMediaEngine y Audio/Video Capture en Media Foundation en lugar de DirectShow, siempre que sea posible. Microsoft sugiere que el código existente que usa las API heredadas se reescriba para usar las nuevas API si es posible.

Descripción

El filtro psi parser recibe información específica del programa (PSI) de un flujo de transporte MPEG-2 y extrae información del programa de la Tabla de asociación de programas (PAT) y tablas de mapa de programa (PMT). Esta información permite a una aplicación configurar el Demultiplexer MPEG-2. El filtro admite una interfaz personalizada, IMpeg2PsiParser, para recuperar la información de PSI.

Este filtro está diseñado para dispositivos MPEG-2, como videocámaras IEEE 1394 MPEG-2 y dispositivos D-VHS. Consulte MSTape Driver (Controlador de MSTape ) para obtener más información. Los orígenes de difusión de televisión digital deben usar un filtro TIF para obtener información del programa.

Uso

Puede probar el filtro del analizador de PSI en GraphEdit de la siguiente manera:

  1. Inicie GraphEdit.

  2. Inserte un origen de transporte MPEG-2. Las videocámaras MPEG-2 y los dispositivos D-VHS aparecen como "Dispositivo de subunidad de cinta de Microsoft AV/C" en la categoría Orígenes de captura de vídeo.

  3. Conecte el filtro de origen al filtro Demultiplexer MPEG-2.

  4. Use la página de propiedades del demux para crear un pin de salida con un tipo de medio "MPEG-2 PSI". Este pin entregará las secciones PAT y PMT.

  5. Use la página de propiedades de demux para asignar piD 0x00 al pin de salida. Establezca el tipo de contenido en "MPEG2 PSI Sections".

  6. Conecte el pin de salida de demux al analizador de PSI, como se muestra en el diagrama siguiente.

    gráfico de filtros psi parser

  7. Ejecute el gráfico para alimentar los datos de PSI al filtro del analizador de PSI. A medida que el filtro descodifica las secciones PAT, asigna automáticamente los PIN de PMT al mismo pin de salida en la demux, de modo que reciba las secciones pmT.

  8. Use la página de propiedades del analizador de PSI para seleccionar un número de programa. La lista de secuencias elementales de la página de propiedades mostrará el PID y el tipo de secuencia asociados a cada flujo elemental del programa seleccionado. La página de propiedades está diseñada para reconocer los tipos de flujo definidos en ISO/IEC 13818-1.

  9. Escriba el número de PID de audio en el cuadro de edición PID de audio y el número de PID de vídeo en el cuadro de edición PID de vídeo.

  10. Haga clic en el botón Ver programa . El analizador de PSI configurará las patillas de salida en la demux para que coincidan con la información de la secuencia del programa y represente las patillas.

Nota:

La página de propiedades del analizador de PSI se proporciona para facilitar las pruebas y proporcionar código de ejemplo que configura el Demultiplexer MPEG-2. No se recomienda que las aplicaciones las usen. Las aplicaciones deben configurar la experiencia demux mediante programación.

 

Para usar el filtro del analizador de PSI en una aplicación, empiece por compilar el grafo de filtro desde el origen MPEG-2 hasta la demux MPEG-2. El código de este paso no se muestra aquí, ya que la configuración exacta del grafo dependerá del origen.

A continuación, cree un pin de salida en el demux para los datos de PSI. Asigne piD 0x00, que está reservado para las secciones PAT, a este pin, como se muestra en el código siguiente:

// 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 obtener más información, vea Using the MPEG-2 Demultiplexer.

Agregue el filtro del analizador de PSI al grafo y conéctelo al pin de salida en el demux. Consulte el analizador de PSI para la interfaz IMpeg2PsiParser . Ahora ejecute el gráfico y espere a EC_PROGRAM_CHANGED eventos, que indican una nueva sección PAT o PMT. Este evento es un evento personalizado definido por el filtro del analizador de PSI. Cuando reciba un evento de EC_PROGRAM_CHANGED, puede obtener la información de PSI disponible llamando a los métodos IMpeg2PsiParser . En esta sección se describen los métodos que necesitará con más frecuencia.

Para obtener el número de programas, use el método IMpeg2PsiParser::GetCountOfPrograms :

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

Para obtener el número de programa de un programa específico, use el método IMpeg2PsiParser::GetRecordProgramNumber :

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

El número de programa se utiliza para obtener las entradas pmT para programas individuales. Para obtener el número de secuencias elementales de un programa, use el método GetCountOfElementaryStreams :

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

Para cada secuencia elemental, el método IMpeg2PsiParser::GetRecordElementaryPid devuelve el PID y el método IMpeg2PsiParser::GetRecordStreamType devuelve el tipo de secuencia:

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

El PID y el tipo de secuencia le permiten configurar nuevos pines de salida en el Demultiplexer MPEG-2. Esto puede requerir algún conocimiento del origen original. Por ejemplo, ISO/IEC 13818-1 define los tipos de flujo 0x80 a través de 0xFF como "usuario privado", pero otros estándares basados en MPEG-2 pueden asignar otros significados a estos tipos.

El Demultiplexer MPEG-2 puede crear nuevas patillas y nuevas asignaciones de PID mientras se ejecuta el gráfico, pero debe detener el grafo para conectar patillas.

Descarga del ejemplo

Para descargar los ejemplos del SDK de DirectShow, instale la versión más reciente de Windows SDK.

Este ejemplo se instala en la siguiente ruta de acceso: [SDK Root]\Samples\Multimedia\DirectShow\Filters\PSIParser.

Ejemplos de DirectShow

Interfaz IMpeg2PsiParser