我正在開發一款應用程序,需要我錄製大量的視頻數據,但我不需要全部存儲它們。 我需要做的是隻保留記錄流的最後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中會讓我們失去所有我們記錄的東西!
想到的最後一個想法是使用組合VideoSink
和FileSink
。 雖然FileSink
做了壓縮魔術(我甚至反編譯這個類來理解它的功能,但裏面沒有代碼!),我們使用VideoSink
的OnSample
方法手動刪除FileSink
使用的mp4文件中不需要的數據。
這一個聽起來很艱難,因爲我不知道如果我能寫既FileSink
和VideoSink
沒有併發問題的文件,我還沒有找到一個很好的C#庫,以幫助我的MP4文件不工作必須處理它的結構。 我找到的唯一一個庫是http://basemedia.codeplex.com/,但它完全沒有文檔(文檔頁面中的每個鏈接都提供了404錯誤)。
我開始認爲這是無法完成的事情,但我想看看是否有人在這裏可以指引我走向正確的方向。只是要清楚,我用「錄音」這個詞而不是「錄製」這個詞,因爲我正在談論的是在錄製過程中修剪視頻! 這不是關於一旦保存後編輯它,而更像是在將文件寫入磁盤時從流中移除內容。
這個想法聽起來很酷,我會盡快嘗試,我會在完成時報告 – StepTNT
你有這方面的更新嗎? – CAMOBAP