我正在使用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%
答案 0 :(得分:2)
一个典型的原因是,在此播放速率下,您的解码线程以100%CPU运行,无法解码更多帧,您开始看到不规则的帧呈现和/或丢帧。
在哪里看:
答案 1 :(得分:1)
对于视频的播放,MediaPlayer正在使用MediaFoundation。对于大多数视频,播放是硬件加速的。如果在DirectShow中解码器和渲染器之间有一些过滤器,则DirectShow中没有硬件加速。 不使用DS.Net Grabber和色彩空间转换器(=> csc也是一个巨大的性能杀手)再试一次。