2013-11-14 13 views
0

在發生一些問題後,我最終設法使用MediaRecorder在我的應用程序中使用視頻錄製。在錄像過程中使用PreviewCallback時Android的MediaRecorder發生死鎖

我現在要做的是在錄製過程中儘可能多地處理預覽幀。即我想抓住一個預覽幀,處理它並在處理這個預覽幀時忽略任何預覽幀。一旦處理完它,我想繼續與下一個即將

爲此,我嘗試了兩種不同的方法:

  1. 通過Camera.addCallbackBuffer(添加兩個緩衝區),並有一個線程工作其中之一,而PreviewCallback在即將到來的幀時立即重新添加當前「未使用」的緩衝區。

  2. 使用setOneShotPreviewCallback(),再次在回調方法和setOneShotPreviewCallback()中處理框架。

一幀處理大約需要500ms。

使用這兩種方法,我得到兩個問題:

  1. 預覽幀率(上TextureView)降低了很多
  2. 主要問題:在大多數情況下,我在錄製過程中或在獲得某種死鎖的錄音結束。

我做什麼(使用setOneShotPreviewCallback() - 方法)這就是:

MediaRecorder mr = new MediaRecorder(); 
(prepare Recorder...) 

mr.start(); 
cam.setOneShotPreviewCallback(myCallbackObject); 

後來,從另一個線程我停止錄音:

mr.stop(); 
cam.setPreviewCallback(null); 
... 

這就是回調方法做什麼:

(do something with the data buffer) 
cam.setOneShotPreviewCallback(this); 

在大多數情況下,我的代碼獲取停留在

mr.stop(); 

但有時也以

cam.setOneShotPreviewCallback(this); 

回調裏面。

非常感謝您的任何建議!

回答

0

處理一個幀需要足夠的時間來證明a)在AsyncTask中運行它並且b)將預覽幀複製到不同的字節[]。

setOneShotPreviewCallback()似乎是一個不錯的選擇,但將像素複製到預先分配的數組並儘可能快地從onPreviewFrame()返回。

+0

感謝您的回答!我試過了。複製onPreviewFrame方法中的緩衝區並啓動處理複製數據的新線程。仍然是同樣的行爲。 – Robert

+0

啊,好的!我想我擺脫了「僵局」問題。我現在從UI線程調用mr.stop(),看起來這不再鎖定。 但有一點仍然是一個問題:幀率下降。我可以在預覽顯示中看到它,並在結果視頻中看到它(更糟糕的是!)。爲什麼這會發生呢?我的測試設備(SGSII)工作太多了嗎?我在調用PreviewCallback的線程中做的唯一事情是複製緩衝區並啓動輔助線程。 – Robert

+0

嗯..如果你不啓動工作線程(沒有圖像處理),你看到相同的減速? –