将 Demux 与 PSI 流配合使用
[与此页面关联的功能 DirectShow 是一项旧功能。 它已被 MediaPlayer、 IMFMediaEngine 和 媒体基金会中的音频/视频捕获取代。 这些功能已针对Windows 10和Windows 11进行了优化。 Microsoft 强烈建议新代码尽可能使用 MediaPlayer、 IMFMediaEngine 和 Media Foundation 中的音频/视频捕获 ,而不是 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 映射到同一输出引脚,这非常有用。
相关主题