2011-08-12 15 views
17

在初始化攝像頭並開始預覽(Camera.startPrevew())後,調用onPreviewFrame時沒有問題。問題是如果我使用MediaRecorder onPreviewFrame進行視頻錄製不會再被調用。使用Camera.PreviewCallback實現時,攝像機onPreviewFrame未調用

據我所知,當使用MediaRecorder記錄視頻停止Camera.PreviewCallback,但爲什麼不能重新啓動?

我已經嘗試重置相機預覽回調(setPreviewCallback(回調))並重新啓動startPreview,但是當我有一個預覽沒有調用onPreviewFrame。

回答

4

你應該)previewCallBacks的新實例(界面中調用它,就像下面

public void surfaceCreated(SurfaceHolder holder) { 
     // if (mediaRecorder == null) { 
     try { 
      camera = Camera.open(); 
      camera.setPreviewCallback(new PreviewCallback() { 
       public void onPreviewFrame(byte[] _data, Camera _camera) { 
       } 
      } 
     } 
} 
1

你需要重新視頻或照片的拍攝之後調用startPreview()。

12

您必須在surfaceChanged方法中調用setPreviewCallback,而不僅僅是在surfaceCreated中。

public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) { 
if (mHolder.getSurface() == null){ 
    return; 
} 

try { 
    mCamera.stopPreview(); 
} catch (Exception e){ 
    // ignore: tried to stop a non-existent preview 
} 

try { 
    mCamera.setPreviewCallback(this); 
    mCamera.setPreviewDisplay(mHolder); 
    mCamera.startPreview(); 

} catch (Exception e){ 
    Log.d(TAG, "Error starting camera preview: " + e.getMessage()); 
} 
} 
+0

謝謝,這對我有用! – Austin

7

我有類似的問題;看到

setOneShotPreviewCallback not hitting onPreviewFrame() in callback

我發現了什麼,調用Camera#unlock()準備MediaRecorder後,有必要設置預覽回調之前調用Camera#reconnect()。這是因爲Camera.unlock()會將相機從進程中分離出來,以便MediaRecorder連接到該進程。

http://developer.android.com/reference/android/hardware/Camera.html#unlock()

在我的調查,我還發現,如果你設置使用其他方法比一步法任何預覽回調,你必須調用Camera#reconnect()以及之後所有這些復位。所以,簡單地說:

mCamera.unlock(); 
//set up MediaRecorder 
mCamera.reconnect(); 
mCamera.setPreviewCallback(mCallback); 
//or whatever callback method you want to use 
//and even if you've set this callback already 

我希望有幫助!

+0

這解決了我的問題。我正在調用'lock()'而不是'reconnect()'。 –