我正在使用DirectShow/VMR9在我的应用程序中播放MPEG 4视频。我使用IMediaSeeking SetRate来设置视频的速度。播放我创建的视频时播放速度高达4倍,在此之上,视频变得非常生涩。使用Windows媒体播放器以4倍以上的速度播放相同的文件不会出现问题。任何人都可以点亮一些为什么Windows媒体播放器可以在速度上播放我的文件,但我的DirectShow滤镜图形不能。DirectShow Jerky视频播放速度
我图的拓扑结构是Recording.avi - > AVI分离器 - > Mpeg4s解码器DMO - > Ds.NET采集卡 - >色彩空间转换器 - >视频混合渲染9.
请让我知道如果你需要任何更多信息。
更新
我删除抓取(因此CSC以及)和播放不生涩高达8倍这将是不够好,但我确实需要抓取。当我添加抓取器时,CSC在那里结束。如果可能的话,我希望删除CSC以查看在保持抓取器的同时是否改善了情况。以下是我的图表,带有和不带过滤器的中间格式。我试图将抓取器的媒体子类型设置为NV12(就像非抓取图一样),但是我得到错误“没有找到中间过滤器的组合可以进行连接。”我包含配置抓取器的代码。
是否有可能让这个工作没有csc?
还不确定它是否相关,但我不明白如何在没有抓取器的情况下更改视频尺寸。
随着抓取
Recording.avi -----(AVI)----- AVI分配器-----(MP4V - 704 * 576 - 24位)----- Mpeg4s解码器DMO -----(RGB24 704 * 576)----- Ds.NET抓取器 - (RGB24 704 * 576)-----色彩空间转换器-----(ARGB32 704 * 576) - ---视频混合渲染9
没有抓取
Recording.avi -----(AVI)----- AVI分配器-----(MP4V - 704个* 576 - 24位)----- 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内存
4倍速
CPU1〜45%
CPU2〜0%
CPU3〜33%
CPU4〜0%
8倍速
CPU1〜40%
CPU2〜25%(但非常尖0-50%)
CPU3〜40%
CPU4〜0%
Core i3 - 3300MHz - 在BIOS中禁用超线程。
4倍速
CPU1〜45%
CPU2〜33%
8倍速(在16倍速相同的结果)
CPU1〜66%
CPU2〜45%
CPU负载不是太高,我开始看到抖动和高速播放时帧丢失。去除抓取器似乎可以改善事情。 – integra753 2012-03-26 11:48:27
抓取器和CSC过滤器本身并不是问题 - 它们的开销很小(另一个答案则相反,但它不完全正确)。添加采集卡时遇到的问题是解码器不得不输出'RGB'视频,而不是格式良好的'NV12'。 'RGB'转换增加了开销,并且消耗更多的硬件带宽 - 这是性能受到的影响。但这正是你设置你的管道所做的事情,因为你想从采集卡中将RGB数据复制到应用程序中。无论如何,我仍然怀疑瓶颈是CPU和/或你的抓取器回调。 – 2012-03-26 12:01:05
我已将CPU使用情况详细信息添加到原始文章中我不认为它们过高?另外关于你对回调的评论,我没有使用一个缓冲帧'sampleGrabber.SetBufferSamples(true);'然后使用'sampleGrabber.GetCurrentBuffer(xx,xx)',每当按下捕捉图像按钮时。 – integra753 2012-03-26 14:12:16