2011-05-04 63 views
1

我目前正在嘗試創建一個需要視頻文件(通常是AVI)並嘗試將其轉換爲圖像的程序。到目前爲止,我得到了完美的流程,如果需要的話可以單獨使用。但是,我想看看是否可以優化速度。所以我的問題是,如果有可能通過塊將視頻文件的一部分加載到內存塊中而不是流式傳輸它。也許可以將2 - 3分鐘的剪輯加載到緩衝區中,進行處理,然後在接下來的2到3分鐘的視頻中重複使用它。我查看了Direct Show和OpenCV加載和播放視頻文件,但到目前爲止還沒有找到任何有關將視頻加載到緩衝區的信息。任何指向教程或概念的鏈接都非常感謝。將視頻文件加載到C++中的緩衝區中

這將在Windows XP/7計算機上開發,如果有幫助的話。

回答

2

你可以做的是從磁盤加載幾幀,讓它稱爲一個N幀的塊。一旦爲緩衝區設置了限制,就可以將幀拉出並處理它們。您可以使用兩個隊列(Q1和Q2)和兩個線程(T1和T2)並行執行此操作。在使用T2處理來自Q1的幀時,可以使用T1加載Q2。當一個隊列已滿時,您將執行一個上下文切換隊列,並將這些幀拉出並處理它們,而另一個隊列正在從磁盤加載幀。當然,您需要處理與這種方法相關的線程/並行複雜性,在這種情況下,BOOST線程可能會有所幫助。

+0

我明白,但我問的問題是如何將幀加載到緩衝區。 – Seb 2011-05-04 19:01:52

+0

@Seb,如果你的意思是一般的內存,那麼我可以說是你創建了一個IPLImage類型的隊列。一旦可用,您只需將框架推到那裏。我以這種方式思考緩衝區。 – 2011-05-04 19:03:09

+0

@Wajih,聽起來好像會起作用。在那種情況下,我能夠打開視頻文件兩次,並讓每個線程排隊一部分所需的圖像?像線程1從視頻文件的0點到1點59分,線程2從2點到2點59分,或者這將是一個瓶頸? – Seb 2011-05-04 19:07:43

1

這樣的應用程序的瓶頸是從盤讀取文件,並每一幀轉換成圖像。你無法擺脫這些任務。除非你以錯誤的方式去做,否則你無法做什麼來顯着加速應用程序的執行。

希望您不必將這些圖像寫回磁盤。

+0

圖像必須在某個時刻寫入磁盤。在那種情況下,我正在考慮處理視頻文件的一部分,直到達到最大量的緩衝區。然後處理這些緩衝區以生成圖像。如果我發現內存消耗不錯,或者在重複此過程之前開始將圖像推入磁盤,則我會重複該過程。 – Seb 2011-05-04 18:58:26

+0

使一個線程讀取文件並將幀轉換爲圖像,而另一個線程只是檢索這些圖像並將它們寫入磁盤。有時,開發這個系統所涉及的工作量並不足以證明他們將提供的性能提高。 – karlphillip 2011-05-04 19:24:24

相關問題