PSI ストリームでの Demux の使用

[このページに関連付けられている機能 DirectShow は、従来の機能です。 MediaPlayer、IMFMediaEngine、Media Foundation のオーディオ/ビデオ キャプチャに置き換わりました。 これらの機能は、Windows 10とWindows 11用に最適化されています。 新しいコードでは、可能であれば、DirectShow ではなく Media Foundation で MediaPlayerIMFMediaEngineAudio/Video Capture を使用することを強くお勧めします。 Microsoft は、レガシ API を使用する既存のコードを、可能であれば新しい API を使用するように書き換えるよう提案しています。]

MPEG-2 demux フィルターを使用して MPEG-2 トランスポート ストリームから PSI 情報を取得するには、次のメディアの種類の demux に出力ピンを作成します。

  • メジャーの種類: KSDATAFORMAT_TYPE_MPEG2_SECTIONS
  • サブタイプ: MEDIASUBTYPE_None
  • 形式の種類: GUID_NULL

次に、出力ピンの IMPEG2PIDMap::MapPID メソッドを、目的の PID とフラグ MEDIA_MPEG2_PSIで呼び出します。

// Query the demux filter for IMpeg2Demultiplexer.
IMpeg2Demultiplexer *pDemux = NULL;
hr = pFilter->QueryInterface(IID_IMpeg2Demultiplexer, (void**)&pDemux);
if (SUCCEEDED(hr))
{
    // Define the media type.
    AM_MEDIA_TYPE mt;
    ZeroMemory(&mt, sizeof(AM_MEDIA_TYPE));
    mt.majortype = KSDATAFORMAT_TYPE_MPEG2_SECTIONS;
    mt.subtype = MEDIASUBTYPE_None;

    // Create a new output pin.
    IPin *pPin;
    hr = pDemux->CreateOutputPin(&mt, L"PSI Pin", &pPin);
    if (SUCCEEDED(hr))
    {
        // Map the PID.
        IMPEG2PIDMap *pPidMap = NULL;
        hr = pPin->QueryInterface(IID_IMPEG2PIDMap, (void**)&pPidMap);
        if (SUCCEEDED(hr))
        {
            ULONG Pid[] = { 0x00 }; // Map any desired PIDs. 
            ULONG cPid = 1;
            hr = pPidMap->MapPID(cPid, Pid, MEDIA_MPEG2_PSI);
            pPidMap->Release();
        }
        pPin->Release();
    }
    pDemux->Release();
}

各完全な PSI セクションは、1 つのメディア サンプルで提供されます。 テーブル セクションに関連付けられている PID 番号を取得するには、メディア サンプルで IMediaSample2::GetProperties を呼び出します。 PID は、AM_SAMPLE2_PROPERTIES構造体の dwTypeSpecificFlags フラグの下位 13 ビットで指定されます。 これは、複数の PSI PID を同じ出力ピンにマップする場合に便利です。

MPEG-2 デマルチプレクサーの使用