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