DirectShow 获取视频属性
DirectShow get video properties
我想从媒体文件中提取视频属性。更准确地说,我感兴趣的是:
宽度、高度、持续时间、帧速率、比特率、帧数、编解码器。
到目前为止我做了什么:
我已经构建了 GraphBuilder (pGraph)。
我从 IMediaSeeking 界面得到 duration。
当解码器使用 ISampleGrabber
解码帧时,我动态得到 帧数
我设法从 IBasicVideo 界面获取高度、宽度和平均采样持续时间(并计算帧速率 = 平均采样持续时间 * 采样计数),但它仅在我调用 pGraph->RenderFile 时有效() 在 GraphBuilder 上。当我使用 pGraph->AddSourceFilter() 方法添加源时,此选项不起作用。
所以我的问题是:是否有一种好的方法可以一次获取所有这些信息。如果没有,请告诉我如何提取其余属性(回想一下,我已经有了帧数和持续时间)
您可以从过滤器图中连接的引脚的媒体类型中提取此类信息。有或没有样品采集器,或有多个样品采集器。使用样本采集器可以让您 ISampleGrabber::GetConnectedMediaType
立即访问 pin 连接媒体类型,从而简化了这一过程。
解复用器和解码器(即解码器输入)之间的连接具有带编解码器(子类型和 BITMAPINFOHEADER::biCompression 字段)、比特率、分辨率的媒体类型。
您也可以使用 GraphStudioNext 轻松地以交互方式检查值(当然也可以通过编程方式访问)。
DirectShow 编辑服务为您提供 Media Detector (MediaDet)
,可以轻松访问某些详细信息。我不推荐使用它,因为它不灵活,而且实际上是 DirectShow 过滤器图的相同包装器,它完全按照我上面提到的方式进行:遍历连接并提取值以将它们公开给调用者。
我想从媒体文件中提取视频属性。更准确地说,我感兴趣的是:
宽度、高度、持续时间、帧速率、比特率、帧数、编解码器。
到目前为止我做了什么:
我已经构建了 GraphBuilder (pGraph)。
我从 IMediaSeeking 界面得到 duration。
当解码器使用 ISampleGrabber
解码帧时,我动态得到 帧数我设法从 IBasicVideo 界面获取高度、宽度和平均采样持续时间(并计算帧速率 = 平均采样持续时间 * 采样计数),但它仅在我调用 pGraph->RenderFile 时有效() 在 GraphBuilder 上。当我使用 pGraph->AddSourceFilter() 方法添加源时,此选项不起作用。
所以我的问题是:是否有一种好的方法可以一次获取所有这些信息。如果没有,请告诉我如何提取其余属性(回想一下,我已经有了帧数和持续时间)
您可以从过滤器图中连接的引脚的媒体类型中提取此类信息。有或没有样品采集器,或有多个样品采集器。使用样本采集器可以让您 ISampleGrabber::GetConnectedMediaType
立即访问 pin 连接媒体类型,从而简化了这一过程。
解复用器和解码器(即解码器输入)之间的连接具有带编解码器(子类型和 BITMAPINFOHEADER::biCompression 字段)、比特率、分辨率的媒体类型。
您也可以使用 GraphStudioNext 轻松地以交互方式检查值(当然也可以通过编程方式访问)。
DirectShow 编辑服务为您提供 Media Detector (MediaDet)
,可以轻松访问某些详细信息。我不推荐使用它,因为它不灵活,而且实际上是 DirectShow 过滤器图的相同包装器,它完全按照我上面提到的方式进行:遍历连接并提取值以将它们公开给调用者。