PSI 剖析器篩選範例
[與此頁面 相關的功能 DirectShow是舊版功能。 它已被 MediaPlayer、 IMFMediaEngine和 Media Foundation 中的音訊/視訊擷取取代。 這些功能已針對Windows 10和Windows 11進行優化。 Microsoft 強烈建議新程式碼盡可能使用 MediaPlayer、 IMFMediaEngine 和 音訊/視訊擷取 ,而不是 DirectShow。 Microsoft 建議盡可能重寫使用舊版 API 的現有程式碼,以使用新的 API。]
Description
PSI 剖析器篩選器會從 MPEG-2 傳輸資料流程接收 Program Specific Information (PSI) ,並從 Program Association Table (PAT) 和 Program Map Tables (PMT) 擷取程式資訊。 這項資訊可讓應用程式設定 MPEG-2 Demultiplexer。 此篩選支援自訂介面 IMpeg2PsiParser來擷取 PSI 資訊。
此篩選器是針對 MPEG-2 裝置所設計,例如 IEEE 1394 MPEG-2 攝影機和 D-VHS 裝置。 如需詳細資訊,請參閱 MSTape 驅動程式 。 數位電視廣播來源應該使用 TIF 篩選來取得程式資訊。
使用方式
您可以在 GraphEdit 中測試 PSI 剖析器篩選器,如下所示:
啟動 GraphEdit。
插入 MPEG-2 傳輸來源。 影片擷取來源類別中的 MPEG-2 攝影機和 D-VHS 裝置顯示為 「Microsoft AV/C 磁帶子單位裝置」。
將來源篩選器連線到 MPEG-2 Demultiplexer 篩選器。
使用 demux 上的屬性頁來建立具有 「MPEG-2 PSI」 媒體類型的輸出釘選。 此針腳會傳遞 PAT 和 PMT 區段。
使用 demux 屬性頁,將 PID 0x00對應至輸出針腳。 將內容類型設定為 「MPEG2 PSI 區段」。
將 demux 輸出針腳連接到 PSI 剖析器,如下圖所示。
執行圖形,以便將 PSI 資料摘要至 PSI 剖析器篩選器。 當篩選解碼 PAT 區段時,它會自動將 PMT PID 對應至 demux 上的相同輸出針腳,以便接收 PMT 區段。
使用 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 上建立輸出釘選。 將 PID 0x00保留給 PAT 區段,對應到此釘選,如下列程式碼所示:
// 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 剖析器。 現在執行圖表並等候EC_PROGRAM_CHANGED事件,以發出新的 PAT 或 PMT 區段的訊號。 此事件是由 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。
相關主題