Windows 我可以从DirectShow获取未经播放的原始视频帧吗 我正在使用媒体基金会做媒体播放器。我想支持VOB文件播放。然而,媒体基金会目前不支持VOB容器。因此,我也希望使用DirectShow 我的想法不是使用一个直接显示图来替代一个路径,而是抓取一个视频帧并把它传递给媒体基础中的同一个流水线。在媒体基金会中,我有一个“imfaseLoad”,它只是从视频文件中读取帧。是否有一个直接显示等价物,它只给我帧而不需要创建图形,开始播放循环,然后尝试从渲染引脚提取帧?(更清楚地说,DirectsShow是否支持这样一种架构:它可以在不播放视频的情况下为我提供原始帧?)

Windows 我可以从DirectShow获取未经播放的原始视频帧吗 我正在使用媒体基金会做媒体播放器。我想支持VOB文件播放。然而,媒体基金会目前不支持VOB容器。因此,我也希望使用DirectShow 我的想法不是使用一个直接显示图来替代一个路径,而是抓取一个视频帧并把它传递给媒体基础中的同一个流水线。在媒体基金会中,我有一个“imfaseLoad”,它只是从视频文件中读取帧。是否有一个直接显示等价物,它只给我帧而不需要创建图形,开始播放循环,然后尝试从渲染引脚提取帧?(更清楚地说,DirectsShow是否支持这样一种架构:它可以在不播放视频的情况下为我提供原始帧?),windows,directshow,ms-media-foundation,Windows,Directshow,Ms Media Foundation,我读过关于ISampleGrabber的文章,但它已被弃用,我认为它不适合我的体系结构。我以前没有在DirectShow上工作过 谢谢, Mots您必须构建一个图形,并从相应的解析器/解复用器过滤器中接受帧,该过滤器将读取容器并在其输出上交付单个帧 播放不必是实时的,也不需要在某处假画那些视频帧。在示例抓取器过滤器或客户过滤器中获得所需数据后,可以使用空呈现器终止管道。也就是说,您可以以或多或少方便的方式安排获取所需的帧。您可以使用连接VOB DS过滤器的输出-它工作得很好。有关如何将输出连接到

我读过关于ISampleGrabber的文章,但它已被弃用,我认为它不适合我的体系结构。我以前没有在DirectShow上工作过

谢谢,
Mots

您必须构建一个图形,并从相应的解析器/解复用器过滤器中接受帧,该过滤器将读取容器并在其输出上交付单个帧


播放不必是实时的,也不需要在某处假画那些视频帧。在
示例抓取器
过滤器或客户过滤器中获得所需数据后,可以使用
空呈现器
终止管道。也就是说,您可以以或多或少方便的方式安排获取所需的帧。

您可以使用连接VOB DS过滤器的输出-它工作得很好。有关如何将输出连接到外部应用程序的说明,请参见此处的注释。

谢谢您的提示,尽管我不完全确定如何实现这一点。从我看到的非DirectShow示例中,我们构建了一个图形、拓扑和所有内容,然后在管理器上调用“Run”。Run方法开始视频播放循环。你是说,在我的拓扑结构中,我放置了一个空的渲染器并调用“Run”,采样捕获器过滤器会间歇性地接收每一帧的帧吗?我在想,它是否会提供一些东西,让我用视频文件初始化DirectShow,加载必要的解码器,我可以重复调用“Read”并获取视频样本帧。在DirectShow(与MF相反)中,图形无法管理过滤器之间的大量通信。一旦您构建图形/管道并点击开始,过滤器就可以自己流式传输数据。也就是说,要捕获帧,您需要在VOB容器读取器旁边的管道中使用自己的过滤器(或者,如果您需要解码帧,也可以使用视频解码器),或者可以使用Statnard采样采集过滤器设置,通过其
SampleCB
方法为您提供回调。然后,一旦你运行图表,你就会在这个回调中一个接一个地获得所有视频帧。正如我所说的,你可以获得原始和/或解码的视频帧,这取决于你是在视频解码器之前还是之后包括你的“抓取点”。你甚至可以在那里有两个抓取器,在之前和之后,你将有一个原始和解码视频帧的回调。谢谢,我将尝试按照建议实现。我看过ISampleGrabber的示例,但不完全确定如何停止渲染周期。过滤器如何在它们之间传输数据?在这种情况下,谁来管理帧速率和时间戳?它像MF的媒体会话架构,在其中创建一个拓扑,会话管理通过MFTS(媒体基础转换)的数据流。DirectShow不同于MF。也许您需要阅读“DirectShow中的数据流概述”,您可以通过停止图形来停止渲染。当您想要限制流时,您可以随时在回调中
休眠
(好吧,也许您更愿意
等待多个对象
)。