PSI パーサー フィルターのサンプル
[このページに関連付けられている機能 DirectShow は、従来の機能です。 MediaPlayer、IMFMediaEngine、および Media Foundation のオーディオ/ビデオ キャプチャに置き換わりました。 これらの機能は、Windows 10とWindows 11用に最適化されています。 新しいコードでは、可能であれば、DirectShow ではなく Media Foundation で MediaPlayer、IMFMediaEngine、Audio/Video Capture を使用することを強くお勧めします。 Microsoft は、従来の API を使用する既存のコードを、可能であれば新しい API を使用するように書き直すよう提案しています。]
説明
PSI パーサー フィルターは、MPEG-2 トランスポート ストリームからプログラム固有情報 (PSI) を受信し、プログラム関連付けテーブル (PAT) とプログラム マップ テーブル (PMT) からプログラム情報を抽出します。 この情報により、アプリケーションで MPEG-2 Demultiplexer を構成できます。 フィルターでは、PSI 情報を取得するためのカスタム インターフェイス IMpeg2PsiParser がサポートされています。
このフィルターは、IEEE 1394 MPEG-2 ビデオカメラや D-VHS デバイスなどの MPEG-2 デバイス用に設計されています。 詳細については、「 MSTape ドライバー 」を参照してください。 デジタル テレビ放送ソースでは、TIF フィルターを使用してプログラム情報を取得する必要があります。
使用方法
GraphEdit では、次のように PSI パーサー フィルターをテストできます。
GraphEdit を起動します。
MPEG-2 トランスポート ソースを挿入します。 MPEG-2 ビデオカメラと D-VHS デバイスは、[ビデオ キャプチャ ソース] カテゴリに "Microsoft AV/C テープ サブユニット デバイス" と表示されます。
ソース フィルターを MPEG-2 Demultiplexer フィルターに接続します。
demux のプロパティ ページを使用して、"MPEG-2 PSI" メディアタイプの出力ピンを作成します。 このピンは PAT セクションと PMT セクションを提供します。
出力ピンに PID 0x00をマップするには、demux プロパティ ページを使用します。 コンテンツ タイプを "MPEG2 PSI セクション" に設定します。
次の図に示すように、demux 出力ピンを PSI パーサーに接続します。
PSI データを PSI パーサー フィルターにフィードするために、グラフを実行します。 フィルターは PAT セクションをデコードすると、PMT セクションを受け取るように、PMT PID を demux の同じ出力ピンに自動的にマップします。
PSI パーサー のプロパティ ページを使用して、プログラム番号を選択します。 プロパティ ページの基本ストリームリストには、選択したプログラムの各基本ストリームに関連付けられている PID とストリームの種類が表示されます。 プロパティ ページは、ISO/IEC 13818-1 で定義されているストリームの種類を認識するように設計されています。
[オーディオ PID] 編集ボックスにオーディオ PID 番号を入力し、[ビデオ PID ] 編集ボックスに ビデオ PID 番号を入力します。
[ プログラムの表示 ] ボタンをクリックします。 PSI パーサーは、プログラム ストリーム情報と一致するように demux の出力ピンを構成し、ピンをレンダリングします。
注意
PSI パーサーのプロパティ ページは、テストを容易にし、MPEG-2 Demultiplexer を構成するサンプル コードを提供するために用意されています。 アプリケーションで使用することはお勧めしません。 アプリケーションでは、プログラムで demux を構成する必要があります。
アプリケーションで PSI パーサー フィルターを使用するには、まず、MPEG-2 ソースから MPEG-2 demux にフィルター グラフを作成します。 正確なグラフ構成はソースによって異なるため、この手順のコードはここには表示されません。
次に、PSI データの demux に出力ピンを作成します。 次のコードに示すように、PAT セクション用に予約されている PID 0x00をこのピンにマップします。
// 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);
}
詳細については、「 MPEG-2 Demultiplexer の使用」を参照してください。
PSI パーサー フィルターをグラフに追加し、demux の出力ピンに接続します。 IMpeg2PsiParser インターフェイスの PSI パーサーに対してクエリを実行します。 グラフを実行し、新しい PAT または PMT セクションを通知するEC_PROGRAM_CHANGED イベントを待機します。 このイベントは、PSI パーサー フィルターによって定義されるカスタム イベントです。 EC_PROGRAM_CHANGED イベントを受信すると、 IMpeg2PsiParser メソッドを呼び出すことで、使用可能な PSI 情報を取得できます。 このセクションでは、最も頻繁に必要になる方法について説明します。
プログラムの数を取得するには、 IMpeg2PsiParser::GetCountOfPrograms メソッドを 使用します。
int NumProgs = 0;
hr = pPsi->GetCountOfPrograms(&NumProgs);
特定のプログラムのプログラム番号を取得するには、 IMpeg2PsiParser::GetRecordProgramNumber メソッドを使用します。
WORD ProgNum = 0;
for (int i = 0; i < NumProgs; i++)
{
hr = pPsi->GetRecordProgramNumber(i, &ProgNum);
...
}
プログラム番号は、個々のプログラムの PMT 項目を取得するために使用されます。 プログラム内の基本ストリームの数を取得するには、 GetCountOfElementaryStreams メソッドを 使用します。
WORD cElemStreams = 0;
hr = pPsi->GetCountOfElementaryStreams(ProgNum, &cElemStreams);
基本ストリームごとに、 IMpeg2PsiParser::GetRecordElementaryPid メソッドは PID を返し、 IMpeg2PsiParser::GetRecordStreamType メソッドはストリームの種類を返します。
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);
}
PID とストリームの種類を使用すると、MPEG-2 Demultiplexer で新しい出力ピンを構成できます。 これには、元のソースに関する知識が必要な場合があります。 たとえば、ISO/IEC 13818-1 では、0xFFを介して0x80ストリームの種類が "ユーザー プライベート" として定義されていますが、MPEG-2 に基づく他の標準では、これらの型に他の意味が割り当てられる場合があります。
MPEG-2 Demultiplexer では、グラフの実行中に新しいピンと新しい PID マッピングを作成できますが、ピンを接続するにはグラフを停止する必要があります。
サンプルのダウンロード
DirectShow SDK サンプルをダウンロードするには、最新バージョンの Windows SDK をインストールします。
このサンプルは、[ SDK Root]\Samples\Multimedia\DirectShow\Filters\PSIParser のパスの下にインストールされます。
関連トピック