【发布时间】:2013-05-06 18:09:11
【问题描述】:
我正在为我正在制作的应用程序创建一个视频捕获 Activity,我还想捕获一个预览帧以用作播放按钮。我在onCreate(...) 中设置了SurfaceView,并在SurfaceHolder.Callback 中连接了相机的预览显示:
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.PreviewCallback 的onPreviewFrame(...) 方法。
正如我所说,拥有它的目的是从录制视频的开头获取一帧以显示给用户。为什么回调没有被命中?
【问题讨论】:
标签: android callback android-camera preview android-mediarecorder