2013-09-21 30 views
2

我正在開發一款應用程序,需要我錄製大量的視頻數據,但我不需要全部存儲它們。 我需要做的是隻保留記錄流的最後X分鐘。保持錄製視頻的最後X分鐘

這意味着我需要一種方法來刪除最舊的樣本,每次我需要存儲一個新的。

於是我開始這篇文章的工作:http://msdn.microsoft.com/library/windowsphone/develop/hh394041%28v=vs.105%29.aspx

,我不得不是隻需要調用StopVideoRecording(),然後StartVideoRecording()使用計時器每X分鐘的第一個想法。

現在,起初這是有道理的,但它不會工作。

問題是,這樣做會每X分鐘刪除以前的數據。

這意味着,如果我們記錄12分鐘,並且我們需要保留最後5個,按照這個想法,我們將刪除前5個,然後是後5個,只剩下最後2分鐘,這不是我正在尋找。

因爲OnSample方法,我將注意力轉移到VideoSink類。

這看起來很簡單,我們攔截每個樣本,並將其存儲在固定大小的字節數組中(大小取決於所需的長度和樣本大小)。

當緩衝區已滿時,我們只需在添加新樣本之前移動左側的所有內容。 問題是,只有1分鐘的測試視頻生成了2GB樣本,這使得這種方式很難管理。

我知道那些樣本是未壓縮的,但是對於智能手機來說,獲取樣本,壓縮它,移動一個大數組,插入樣本並將數組寫入文件並在其上進行操作並不難每個樣品都收到了嗎?

是的,我正在討論將數組寫入文件,因爲我們需要以某種方式持久化該視頻。可能會發生電池停止工作,並將其存儲在RAM中會讓我們失去所有我們記錄的東西!

想到的最後一個想法是使用組合VideoSinkFileSink。 雖然FileSink做了壓縮魔術(我甚至反編譯這個類來理解它的功能,但裏面沒有代碼!),我們使用VideoSinkOnSample方法手動刪除FileSink使用的mp4文件中不需要的數據。

這一個聽起來很艱難,因爲我不知道如果我能寫既FileSinkVideoSink沒有併發問題的文件,我還沒有找到一個很好的C#庫,以幫助我的MP4文件不工作必須處理它的結構。 我找到的唯一一個庫是http://basemedia.codeplex.com/,但它完全沒有文檔(文檔頁面中的每個鏈接都提供了404錯誤)。

我開始認爲這是無法完成的事情,但我想看看是否有人在這裏可以指引我走向正確的方向。只是要清楚,我用「錄音」這個詞而不是「錄製」這個詞,因爲我正在談論的是在錄製過程中修剪視頻! 這不是關於一旦保存後編輯它,而更像是在將文件寫入磁盤時從流中移除內容。

回答

1

我不能提供一個代碼給你,但只是一個想法。因爲你有要求:

  1. 我需要做的是隻保留記錄流的最後X minutes
  2. 目標平臺是windows phone 8

我想一些修改添加到您的第一個想法:

  1. 寫視頻流的每一分鐘在單獨的文件
  2. 還需要留+1視頻文件多於幾分鐘。例如,如果您需要5分鐘,則應始終保留6個文件,因爲最後一個文件可能未滿。
  3. 通過使用DirectShow你將能夠加入到這個文件到一個。準備好使用C++(作爲替代方案,您可以使用一些服務或爲此創建自己的後端)
+0

這個想法聽起來很酷,我會盡快嘗試,我會在完成時報告 – StepTNT

+0

你有這方面的更新嗎? – CAMOBAP