setOneShotPreviewCallback не выполняет onPreviewFrame() в обратном вызове
Я создаю действия захвата видео для приложения, которое я делаю, и я хочу захватить кадр предварительного просмотра, а также использовать в качестве кнопки воспроизведения. Я установил SurfaceView
сведущий onCreate(...)
и подключил дисплей предварительного просмотра камеры в 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
"s onPreviewFrame(...)
метод пропущен.
Как я уже сказал, цель состоит в том, чтобы получить кадр с начала записи видео для показа пользователю. Почему не перезвонили?
1 ответ
mCamera.unlock()
отсоединяет камеру от процесса. Необходимо позвонить:
mCamera.reconnect();
перед звонком:
mCamera.setOneShotPreviewCallback(mPreviewCallback);
(но после всего остального).