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