setOneShotPreviewCallback no golpea onPreviewFrame () en la devolución de llamada
Estoy creando una actividad de captura de video para una aplicación que estoy creando, y quiero capturar un cuadro de vista previa para usarlo como botón de reproducción. He puesto elSurfaceView
arriba enonCreate(...)
y conectó la pantalla de vista previa de la cámara en elSurfaceHolder.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();
}
}
};
que funcionó bien para la aplicación de cámara estática. La vista previa de la cámara se activa y desactiva enonPause()
yonResume()
:
@Override
protected void onResume() {
super.onResume();
if(mCamera!=null)
mCamera.startPreview();
}
@Override
protected void onPause() {
if(mCamera!=null)
mCamera.stopPreview();
super.onPause();
}
y he puesto elMediaRecorder
de esta manera:
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();
}
Esa penúltima línea, sin embargo, no está funcionando. MiCamera.PreviewCallback
esonPreviewFrame(...)
método se está perdiendo
El propósito de tenerlo es, como digo, obtener un fotograma desde el principio de cuando el video se está grabando para mostrarlo al usuario. ¿Por qué no se está golpeando la devolución de llamada?