Freigeben über


PSI-Parserfilterbeispiel

[Das dieser Seite zugeordnete Feature DirectShow ist ein Legacyfeature. Es wurde durch MediaPlayer, IMFMediaEngine und Audio/Video Capture in Media Foundation ersetzt. Diese Features wurden für Windows 10 und Windows 11 optimiert. Microsoft empfiehlt dringend, dass neuer Code nach Möglichkeit MediaPlayer, IMFMediaEngine und Audio/Video Capture in Media Foundation anstelle von DirectShow verwendet. Microsoft schlägt vor, vorhandenen Code, der die Legacy-APIs verwendet, um nach Möglichkeit die neuen APIs zu verwenden.]

BESCHREIBUNG

Der PSI-Parserfilter empfängt Programmspezifische Informationen (PSI) aus einem MPEG-2-Transportstream und extrahiert Programminformationen aus der Program Association Table (PAT) und Program Map Tables (PMT). Mit diesen Informationen kann eine Anwendung den MPEG-2-Demultiplexer konfigurieren. Der Filter unterstützt eine benutzerdefinierte Schnittstelle, IMpeg2PsiParser, zum Abrufen der PSI-Informationen.

Dieser Filter ist für MPEG-2-Geräte wie IEEE 1394 MPEG-2-Camcorder und D-VHS-Geräte konzipiert. Weitere Informationen finden Sie unter MSTape-Treiber . Digitale Fernsehquellen sollten einen TIF-Filter verwenden, um Programminformationen abzurufen.

Verbrauch

Sie können den PSI-Parser-Filter in GraphEdit wie folgt testen:

  1. Starten Sie GraphEdit.

  2. Fügen Sie eine MPEG-2-Transportquelle ein. MPEG-2-Camcorder und D-VHS-Geräte werden in der Kategorie Videoaufnahmequellen als "Microsoft AV/C Tape-Untereinheitsgerät" angezeigt.

  3. Verbinden Sie den Quellfilter mit dem MPEG-2-Demultiplexer-Filter.

  4. Verwenden Sie die Eigenschaftenseite auf demux, um einen Ausgabepin mit einem Medientyp "MPEG-2 PSI" zu erstellen. Dieser Pin liefert die Abschnitte PAT und PMT.

  5. Verwenden Sie die Eigenschaftenseite demux, um PID-0x00 dem Ausgabenadel zuzuordnen. Legen Sie den Inhaltstyp auf "MPEG2 PSI Sections" fest.

  6. Verbinden Sie den Demux-Ausgabepin mit psi Parser, wie im folgenden Diagramm dargestellt.

    Psi-Parserfilterdiagramm

  7. Führen Sie das Diagramm aus, um PSI-Daten an den PSI-Parserfilter zu senden. Da der Filter die PAT-Abschnitte decodiert, ordnet er die PMT-PIDs automatisch demselben Ausgabepin auf dem Demux zu, sodass er die PMT-Abschnitte empfängt.

  8. Verwenden Sie die Psi Parser-Eigenschaftenseite, um eine Programmnummer auszuwählen. Die Elementardatenstromliste auf der Eigenschaftenseite zeigt die PID und den Streamtyp an, die jedem elementaren Stream im ausgewählten Programm zugeordnet sind. Die Eigenschaftenseite ist zum Erkennen von Streamtypen konzipiert, die in ISO/IEC 13818-1 definiert sind.

  9. Geben Sie die Audio-PID-Nummer im Bearbeitungsfeld Audio-PID und die Video-PID-Nummer im Bearbeitungsfeld Video-PID ein.

  10. Klicken Sie auf die Schaltfläche Programm anzeigen . Der PSI-Parser konfiguriert die Ausgabepins auf dem Demux so, dass sie den Programmdatenstrominformationen entsprechen und die Pins rendern.

Hinweis

Die PSI Parser-Eigenschaftenseite wird bereitgestellt, um das Testen zu vereinfachen und Beispielcode bereitzustellen, der den MPEG-2-Demultiplexer konfiguriert. Es wird nicht empfohlen, anwendungen zu verwenden. Anwendungen sollten den Demux programmgesteuert konfigurieren.

 

Um den PSI-Parserfilter in einer Anwendung zu verwenden, erstellen Sie zunächst das Filterdiagramm aus der MPEG-2-Quelle in den MPEG-2-Demux. Code für diesen Schritt wird hier nicht angezeigt, da die genaue Graphkonfiguration von der Quelle abhängt.

Erstellen Sie als Nächstes einen Ausgabenadel am Demux für die PSI-Daten. Ordnen Sie pid 0x00, die für PAT-Abschnitte reserviert ist, diesem Pin zu, wie im folgenden Code gezeigt:

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

Weitere Informationen finden Sie unter Verwenden des MPEG-2-Demultiplexers.

Fügen Sie dem Diagramm den PSI-Parserfilter hinzu, und verbinden Sie ihn mit dem Ausgabenadel am Demux. Fragen Sie den PSI-Parser für die IMpeg2PsiParser-Schnittstelle ab. Führen Sie nun das Diagramm aus, und warten Sie auf EC_PROGRAM_CHANGED Ereignisse, die einen neuen PAT- oder PMT-Abschnitt signalisieren. Dieses Ereignis ist ein benutzerdefiniertes Ereignis, das durch den PSI-Parserfilter definiert wird. Wenn Sie ein EC_PROGRAM_CHANGED-Ereignis erhalten, können Sie die verfügbaren PSI-Informationen abrufen, indem Sie IMpeg2PsiParser-Methoden aufrufen. In diesem Abschnitt werden die Methoden beschrieben, die Sie am häufigsten benötigen.

Verwenden Sie die IMpeg2PsiParser::GetCountOfPrograms-Methode , um die Anzahl der Programme abzurufen:

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

Um die Programmnummer für ein bestimmtes Programm abzurufen, verwenden Sie die IMpeg2PsiParser::GetRecordProgramNumber-Methode :

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

Die Programmnummer wird verwendet, um die PMT-Einträge für einzelne Programme abzurufen. Verwenden Sie die GetCountOfElementaryStreams-Methode , um die Anzahl der elementaren Datenströme in einem Programm abzurufen:

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

Für jeden elementaren Stream gibt die IMpeg2PsiParser::GetRecordElementaryPid-Methode die PID zurück, und die IMpeg2PsiParser::GetRecordStreamType-Methode gibt den Streamtyp zurück:

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

Mit der PID und dem Streamtyp können Sie neue Ausgabepins für den MPEG-2-Demultiplexer konfigurieren. Dies erfordert möglicherweise einige Kenntnisse der ursprünglichen Quelle. Beispielsweise definiert ISO/IEC 13818-1 Streamtypen 0x80 über 0xFF als "benutzer privat", aber andere Standards, die auf MPEG-2 basieren, können diesen Typen andere Bedeutungen zuweisen.

Der MPEG-2-Demultiplexer kann neue Pins und neue PID-Zuordnungen erstellen, während das Diagramm ausgeführt wird, aber Sie müssen das Diagramm beenden, um Pins zu verbinden.

Herunterladen des Beispiels

Um die DirectShow SDK-Beispiele herunterzuladen, installieren Sie die neueste Version des Windows SDK.

Dieses Beispiel wird unter dem folgenden Pfad installiert: [SDK-Stamm]\Samples\Multimedia\DirectShow\Filters\PSIParser.

DirectShow-Beispiele

IMpeg2PsiParser-Schnittstelle