[英]DirectShow Jerky Video Playback at Speed
我正在使用DirectShow / VMR9在我的应用程序中播放MPEG 4视频。 我使用IMediaSeeking SetRate设置视频的速度。 播放我创建的视频时,其播放速度最高可达4倍,在此之上,视频变得非常生涩。 使用Windows媒体播放器以高于4倍的速度播放同一文件并不容易。 任何人都可以阐明为什么Windows Media Player可以快速播放我的文件但我的DirectShow过滤器无法显示的原因。
我的图形拓扑是Recording.avi-> AVI Splitter-> Mpeg4s解码器DMO-> Ds.NET Grabber->色彩空间转换器->视频混合渲染器9。
如果您需要任何进一步的信息,请告诉我。
更新资料
我卸下了采集卡(因此也取下了csc),并且播放速度最高不超过8倍,这已经足够了,但是我确实需要采集卡。 当我添加采集卡时,CSC结束了。 我想尽可能删除CSC,以查看是否在保留采集卡的同时有所改善。 以下是我的带有中间格式(带和不带过滤器)的图表。 我尝试将抓取器的媒体子类型设置为NV12(例如非抓取器图),但是出现错误“找不到中间过滤器的组合来建立连接”。 我包括用于配置采集卡的代码。
没有csc,是否可以使它正常工作?
也不确定它是否相关,但我不了解在没有抓取器的情况下视频尺寸如何在图形上更改。
与抓斗
Recording.avi -----(AVI)----- AVI分离器-----(MP4V-704 * 576 – 24bits)----- Mpeg4s解码器DMO -----(RGB24 704 * 576 )----- Ds.NET抓取器-(RGB24 704 * 576)-----色彩空间转换器-----((ARGB32 704 * 576)-----视频混合渲染器9
没有抓斗
Recording.avi -----(AVI)----- AVI分离器-----(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使用率详细信息
酷睿i3-3300MHz –具有超线程4GB RAM
4倍速度
CPU1〜45%
CPU2〜0%
CPU3〜33%
CPU4〜0%
8倍速度
CPU1〜40%
CPU2〜25%(但非常尖刻0-50%)
CPU3〜40%
CPU4〜0%
核心i3-3300MHz –在BIOS中禁用了超线程。
4倍速度
CPU1〜45%
CPU2〜33%
8倍速(16倍速时,结果相同)
CPU1〜66%
CPU2〜45%
一个典型的原因是,在此回放速率下,您的解码线程在100%CPU上运行并且无法解码更多帧,您开始看到不规则的帧呈现和/或掉帧。
在哪里看:
为了播放视频,MediaPlayer正在使用MediaFoundation。 对于大多数视频,播放是通过硬件加速的。 如果在DirectShow的解码器和渲染器之间有一些过滤器,则DirectShow中没有硬件加速。 在没有DS.Net Grabber和色彩空间转换器的情况下重试(=> csc还是一个巨大的性能杀手)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.