1

我正在爲我正在創建的應用程序創建視頻捕獲活動,並且我還想捕獲預覽框架以及用作回放按鈕。我已經設置了SurfaceView起來onCreate(...),並迷上了在SurfaceHolder.Callback相機的預覽顯示:setOneShotPreviewCallback未在回調中觸碰onPreviewFrame()

private Callback mSurfaceViewCallback = new Callback() { 

    @Override 
    public void surfaceDestroyed(SurfaceHolder holder) { 
     mSurfaceCreated = false; 
    } 

    @Override 
    public void surfaceCreated(SurfaceHolder holder) { 
     try { 
      mSurfaceCreated = true; 
      mCamera.setPreviewDisplay(mHolder); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
    } 

    @Override 
    public void surfaceChanged(SurfaceHolder holder, int format, int width, 
      int height) { 
     try { 
      mSurfaceCreated = true; 
      mCamera.setPreviewDisplay(mHolder); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
    } 
}; 

這對於靜態相機應用程序正常工作。相機預覽在onPause()onResume()開啓和關閉:

@Override 
protected void onResume() { 
    super.onResume(); 
    if(mCamera!=null) 
     mCamera.startPreview(); 
} 

@Override 
protected void onPause() { 
    if(mCamera!=null) 
     mCamera.stopPreview(); 
    super.onPause(); 
} 

,我已經設置MediaRecorder像這樣:

protected void startRecording() { 
    mMediaRecorder = new MediaRecorder(); 
    mCamera.unlock(); 
    mMediaRecorder.setCamera(mCamera); 
    mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.CAMCORDER); 
    mMediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA); 
    mMediaRecorder.setProfile(CamcorderProfile.get(CamcorderProfile.QUALITY_LOW)); 

    mMediaRecorder.setMaxDuration(10000); 
    mMediaRecorder.setOutputFile(new File(getFilesDir(), mChallengeUUID + ".mp4").getAbsolutePath()); 
    mMediaRecorder.setPreviewDisplay(mHolder.getSurface()); 
    try { 
     mMediaRecorder.prepare(); 
    } catch (IllegalStateException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
    mCamera.setOneShotPreviewCallback(mPreviewCallback); 
    mMediaRecorder.start(); 
} 

即倒數第二行,但是,不能正常工作。我的Camera.PreviewCallbackonPreviewFrame(...)方法正在錯過。正如我所說,它的目的是從視頻開始錄製並顯示給用戶時獲得一幀。爲什麼回撥不被觸發?

回答

1

mCamera.unlock()將攝像頭從過程中分離。因此,有必要呼籲:

mCamera.reconnect(); 

調用之前:

mCamera.setOneShotPreviewCallback(mPreviewCallback); 

(但一切後)。

+0

這不適合我。如果我在mMediaManager.start之前調用mCamera.reconnect,則啓動失敗。如果我在開始後調用它,那麼setOneShotPreviewCallback將被忽略。 – pstoppani 2014-06-02 16:00:04