2010-09-08 53 views
4

我正在C++中開發一個屏幕錄製實用程序。如何優化我的屏幕錄製實用程序?

它基本上捕獲桌面框架並創建一個AVI文件。該算法如下:

  1. 創建一個線程:在每秒thScreenCapture n倍(如5 fps)的this->m_hThread=CreateThread(NULL,0,thScreenCapture,this,0,NULL);
  2. 捕獲桌面。

    obj->Capture();

  3. 在捕捉(),位圖數據附加到AVI文件。

    this->appendBitmapToAvi(this->avifile, bmp);

此實用程序還記錄聲音。因此,在thScreenCapture方法中,聲音數據也被附加到avi文件。

問題是,當幀數超過6幀(這可以根據硬件配置而變化)每秒捕獲時,幀和聲音之間出現滯後。

我正在尋求解決方案來優化算法。一個解決方案可能會緩存內存中的幀,而不是將它們全部附加到avi文件中。但是這會使代碼更復雜,因爲我必須處理在不同線程中捕獲的聲音數據。

您建議如何增加該實用程序支持的fps值而不會失去同步?

+0

你應該考慮directshow(見下面的答案)。它使用參考時鐘和媒體幀的時間戳,以便同步音頻和視頻。雖然視頻幀用於不連續的間隔,但音頻幀的持續時間通常是可變的。 – 2010-09-20 12:34:19

+0

使用DirectX。你是否已經增加了進程/線程的優先級?除此之外,使用一個線程捕獲和預處理圖像緩衝區,另一個線程來縮放和轉換等等。您也可以檢測處理器/內核的數量,併爲每個內核產生一個線程來推遲處理。不幸的是,我對音頻毫無頭緒。 – jweyrich 2010-09-20 15:00:50

回答

1

你是自己編寫AVI文件嗎?一個高尚的努力,但有API來幫助完成這項任務。

如果您正在開發Windows平臺,我建議您考慮使用DirectShowMedia Foundation API將音頻和視頻多路複用到磁盤。 DirectShow是 API,用於在Windows平臺上進行A/V捕獲,流式傳輸和多路複用。

This article on CodeProject關於音頻的討論&視頻同步問題以及DirectShow用於克服此困難的機制。

本質上,使用參考時鐘並且幀被加時間戳。

有一個非常有用的新資源的active DirectShow communityTMH's website非常值得關注 - 他是MS MVP,是社區的活躍成員。

我希望這有助於!

+0

感謝您的建議。我使用的是開源AVI庫,它工作得很好。我已經解決了很多問題,比如添加mp3音頻數據(需要額外的頭文件信息並花費數天的時間才能找到)。現在我需要的是加速我的捕捉引擎。 – Zafer 2010-09-22 10:22:07

1

你可以看看other screencasting software的來源,如CamStudio,看看他們是怎麼做的。

如果你的程序是磁盤綁定的(我懷疑它是),那麼事情可能通過壓縮提高(這是天大的名稱方案,如Camtasia工作室,如何運作)

+0

是的,這是磁盤綁定,這就是爲什麼我用我的問題中沒有提到的優秀的Xvid編解碼器壓縮幀。 – Zafer 2010-09-08 22:14:34

+0

@Zafer:那麼你將不得不記憶緩衝器的東西,否則你將不得不開發自己的編解碼器。這就是Camtasia人做的 - 我寫的是他們自己的編解碼器。 DivX和XviD適用於普通電影視頻,但可以爲屏幕錄像進行更多優化。 – 2010-09-08 22:21:13

+0

你知道關於編解碼器開發的資源嗎? – Zafer 2010-09-09 05:27:09

0

你目標是什麼操作系統?如果你在Windows XP上工作,我會看看http://tmhare.mvps.org/downloads.htm的一些DirectShow代碼,特別是Filter Graph Library。

+0

感謝您的鏈接。我的目標是Win XP,Vista和7。 – Zafer 2010-09-09 16:31:37

1

使用一個循環的雙重或三重緩衝區來存儲位圖併發出每幀聲音,並使用單獨的線程將位圖和聲音添加到avi。因此,數據收集位於一個線程中,數據處於循環(線程安全)緩衝區,數據存儲位於另一個線程中。

+0

A/V幀必須同步!緩衝不會解決這個問題! – 2010-09-20 08:04:46

+0

沒錯。我使用單獨的線程來收集視頻和音頻數據,但將它們以同步的方式添加到avi文件進行交織。 – Zafer 2010-09-22 10:20:17

+0

@freefallr所以Zafer是以交錯的方式進行的,這意味着在主線程中存儲數據並在另一個線程中存儲數據會更有意義。如我錯了請糾正我。 – 2010-09-22 10:39:14