2011-11-02 31 views
3

在Windows上,我有一個動態創建的未壓縮的AVI視頻文件,這會增加超時。生成視頻文件的應用程序只能寫入物理文件。我可以開始/停止生成視頻文件並輕鬆刪除舊視頻文件。拖尾越來越多的視頻文件的最後一幀

我想分析不斷增長的視頻文件的變化的最後一幀,以根據當前/最新圖像的內容實時做出決定。如果我可以達到10fps以上,那就足夠了。 無論何時在視頻文件中提供新幀時,我都希望獲得未壓縮的圖像。

作爲一種文件格式,我認爲png可能是這種情況下的最佳選擇,但我願意替代。 我不知道用ffmpeg或類似的工具是否可以這樣做。

我更喜歡分析圖像並通過使用perl + Imager模塊做出決定。 Tha分析的要求並不複雜。基本上我只需要在最後一幀內的特定位置找到一些小圖像的存在。 我也很感激,如果你可以建議一個有效的方式來從ffmpeg獲取這些信息到我的應用程序。 例如直接輸入我的代碼或從保存的png文件讀取。

我知道Perl已經有一個ffmpeg接口模塊,但據我所知,模塊不能提供我需要的功能。

+0

它看起來像你問如何(一)尾部的文件; (b)解碼來自AVI的各個幀; (c)解決一個不平凡的計算機視覺問題; (d)在一個問題中使用ffmpeg API。如果你想在(c)問一個不同的問題,並提供很多細節,我會試着回答第一個和第二個問題。 – derobert

回答

1

首先,我希望你知道未壓縮視頻的數據速率!例如,在720x480(普通的NTSC,不是高清)和10位的16位顏色下,你每秒產生6.6兆字節。你在不到兩天的時間內填入1TB硬盤。在perl中處理數據速率應該很有趣。

從文件中獲取新幀應該非常簡單,因爲它的未壓縮視頻。

  1. 假設您從AVI的前端開始(例如,您開始捕獲並處理)。
  2. 請閱讀AVI標頭,確保其符合預期(例如正確的格式)。
  3. 請注意當前亞秒系統時間戳(例如,來自Time :: HiRes)。
  4. 你知道單個幀的長度。嘗試sysread吧。繼續嘗試,直到獲得完整幀(當然,每次更新所需的長度),或者獲得EOF(sysread返回0)。
  5. 如果您在全畫面之前得到EOF:睡眠一小段時間(比如說,10ms,Time::HiRes會讓您睡眠時間少於1秒),然後嘗試再次讀取框架的其餘部分。 sysread不需要EOF指示重置;它會在你每次打電話時再試一次。繼續執行延遲/系統讀取循環,直到您有全幀。
  6. 你現在有一個完整的框架。由於它是未壓縮的視頻,因此在將其傳遞到計算機視覺代碼之前,實際上不需要太多解碼。 (你可能需要交換字節,或者從16位轉換爲32位,但沒有比這更糟的)。
  7. 由於您正在閱讀10fps視頻,因此在下一幀之前的1/10秒的剩餘時間內休眠。
  8. 回到(3)。

您可能會發現,如果您使用庫來實現您的計算機視覺,它具有幫助解決這個問題的功能 - 例如,,它可能能夠從AVI文件中讀取幀。例如,OpenCV可以。