2012-03-22 67 views
0

我正在使用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%

回答

2

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

到哪里找:

  • 请与任务管理器或其他应用程序的CPU,看看核心之一是刷爆了,不再将空闲状态
  • 检查VMR性质,看是否掉帧,或者抖动变得过高

enter image description here

+0

CPU负载不是太高,我开始看到抖动和高速播放时帧丢失。去除抓取器似乎可以改善事情。 – integra753 2012-03-26 11:48:27

+0

抓取器和CSC过滤器本身并不是问题 - 它们的开销很小(另一个答案则相反,但它不完全正确)。添加采集卡时遇到的问题是解码器不得不输出'RGB'视频,而不是格式良好的'NV12'。 'RGB'转换增加了开销,并且消耗更多的硬件带宽 - 这是性能受到的影响。但这正是你设置你的管道所做的事情,因为你想从采集卡中将RGB数据复制到应用程序中。无论如何,我仍然怀疑瓶颈是CPU和/或你的抓取器回调。 – 2012-03-26 12:01:05

+0

我已将CPU使用情况详细信息添加到原始文章中我不认为它们过高?另外关于你对回调的评论,我没有使用一个缓冲帧'sampleGrabber.SetBufferSamples(true);'然后使用'sampleGrabber.GetCurrentBuffer(xx,xx)',每当按下捕捉图像按钮时。 – integra753 2012-03-26 14:12:16

1

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

+0

删除抓取器可以消除干扰,尽管我确实需要抓取器。我想尽可能删除csc,请参阅更新我的更新第一篇文章。 – integra753 2012-03-26 11:34:13