2012-03-22 66 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