搭配 PSI 資料流程使用 Demux
[與此頁面相關的功能 DirectShow是舊版功能。 它已被 MediaPlayer、 IMFMediaEngine和 Media Foundation 中的音訊/視訊擷取取代。 這些功能已針對Windows 10和Windows 11進行優化。 Microsoft 強烈建議新程式碼盡可能使用 MediaPlayer、 IMFMediaEngine 和 音訊/視訊擷取 ,而不是 DirectShow。 Microsoft 建議使用舊版 API 的現有程式碼盡可能重寫為使用新的 API。
若要使用 MPEG-2 demux 篩選從 MPEG-2 傳輸資料流程取得 PSI 資訊,請使用下列媒體類型在 demux 上建立輸出針腳:
- 主要類型:KSDATAFORMAT_TYPE_MPEG2_SECTIONS
- 子類型:MEDIASUBTYPE_None
- 格式類型:GUID_Null
然後使用所需的 PID 和旗標MEDIA_MPEG2_PSI呼叫輸出針腳的 IMPEG2PIDMap::MapPID 方法。
// 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 區段都會在一個媒體範例中傳遞。 若要擷取與資料表區段相關聯的 PID 號碼,請在媒體範例上呼叫 IMediaSample2::GetProperties 。 PID 會在AM_SAMPLE2_PROPERTIES結構中dwTypeSpecificFlags 旗標的低 13 位中提供。 如果您將多個 PSI PID 對應至相同的輸出針腳,這會很有用。
相關主題