DirectShow速度快速的视频播放

时间:2012-03-22 10:25:15

标签: c# directshow

我正在使用DirectShow / VMR9在我的应用程序中播放MPEG 4视频。我使用IMediaSeeking SetRate来设置视频的速度。播放我创建的视频播放速度高达4倍,超过此视频变得非常生涩。使用Windows媒体播放器以高于4倍的速度播放相同的文件并不生涩。任何人都可以了解为什么Windows媒体播放器可以快速播放我的文件,但我的DirectShow过滤器图形不能。

我的图表拓扑是Recording.avi - > AVI Splitter - > Mpeg4s解码器DMO - > Ds.NET Grabber - >色彩空间转换器 - >视频混合渲染器9。

如果您需要任何进一步的信息,请与我们联系。

更新

我删除了抓取器(因此也是csc)并且回放速度不高达8倍,这足够好但我确实需要抓取器。当我添加抓取器时,CSC最终到达那里。我想尽可能删除CSC以查看是否可以在保留抓取器的同时改善情况。下面是我的带有和没有过滤器的中间格式的图表。我尝试将抓取器的媒体子类型设置为NV12(就像非抓取器图形一样),但是我得到错误“没有找到中间过滤器的组合来建立连接”。我包含了用于配置抓取器的代码。

是否可以在没有csc的情况下使其工作?

还不确定它是否相关,但我不明白如果没有抓取器,图表上的视频尺寸会如何变化。

使用Grabber

Recording.avi -----(AVI)----- AVI Splitter -----(MP4V - 704 * 576 - 24bits)----- Mpeg4s解码器DMO -----(RGB24 704 * 576)----- Ds.NET Grabber - (RGB24 704 * 576)-----色彩空间转换器-----(ARGB32 704 * 576)-----视频混合渲染器9

没有Grabber

Recording.avi -----(AVI)----- AVI Splitter -----(MP4V - 704 * 576 - 24bits)----- Mpeg4s解码器DMO -----(NV12 768 * 576 12位)-----视频混合渲染器9。

 private void ConfigureSampleGrabber(ISampleGrabber sampleGrabber)
 {
        AMMediaType media;
        int hr;

        // Set the media type to Video/RBG24
        media = new AMMediaType();
        media.majorType = MediaType.Video;
        media.subType = MediaSubType.ARGB32; // tried NV12 here, gives error.
        media.formatType = FormatType.VideoInfo;
        hr = sampleGrabber.SetMediaType(media);
        DsError.ThrowExceptionForHR(hr);

        DsUtils.FreeAMMediaType(media);
        media = null;

        // Configure the samplegrabber
        hr = sampleGrabber.SetBufferSamples(true);
        DsError.ThrowExceptionForHR(hr);
    }

CPU使用情况详情

Core i3 - 3300MHz - 具有超线程4GB RAM

4x速度

CPU1~45%

CPU2~0%

CPU3~33%

CPU4~0%

8x速度

CPU1~40%

CPU2~25%(但非常尖锐0-50%)

CPU3~40%

CPU4~0%

Core i3 - 3300MHz - 在BIOS中禁用超线程。

4x速度

CPU1~45%

CPU2~33%

8倍速(16倍速时相同的结果)

CPU1~66%

CPU2~45%

2 个答案:

答案 0 :(得分:2)

一个典型的原因是,在此播放速率下,您的解码线程以100%CPU运行,无法解码更多帧,您开始看到不规则的帧呈现和/或丢帧。

在哪里看:

  • 使用任务管理器或其他应用程序检查您的CPU,以查看其中一个核心是否已超出并且不再处于空闲状态
  • 检查VMR属性以查看帧是否被丢弃,或者抖动是否过高

enter image description here

答案 1 :(得分:1)

对于视频的播放,MediaPlayer正在使用MediaFoundation。对于大多数视频,播放是硬件加速的。如果在DirectShow中解码器和渲染器之间有一些过滤器,则DirectShow中没有硬件加速。 不使用DS.Net Grabber和色彩空间转换器(=> csc也是一个巨大的性能杀手)再试一次。