Capturar un video usando cámara2 y MediaRecorder

Intento grabar un video con 2 resoluciones diferentes a la vez. A veces todo va bien y, a veces, la aplicación parece quedar atrapado en de los métodos stop () de los 2 MediaRecorders. ¿Puede alguien plz mirar a través de mi código, wheter estoy haciendo algo mal?

package com.example.android.videorecording; import android.app.Activity; import android.app.AlertDialog; import android.content.Intent; import android.hardware.camera2.params.StreamConfigurationMap; import android.media.MediaCodec; import android.media.MediaRecorder; import android.os.Bundle; import android.hardware.camera2.*; import android.os.Environment; import android.util.Size; import android.view.Surface; import android.view.View; import android.widget.Button; import java.io.File; import java.util.ArrayList; import java.util.List; public class MainActivity extends Activity { CameraDevice mCamera; MediaRecorder mMediaRecorderLow = new MediaRecorder(); MediaRecorder mMediaRecorderHigh = new MediaRecorder(); CaptureRequest mCaptureRequest; CameraCaptureSession mSession; boolean recording = false; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); CameraManager manager = (CameraManager) getSystemService(CAMERA_SERVICE); File dir = new File(Environment.getExternalStorageDirectory().getAbsolutePath() , "Test"); if(!dir.exists()) { boolean s = dir.mkdirs(); if(!s) { AlertDialog.Builder alert = new AlertDialog.Builder(this); alert.setMessage("could not create dir"); alert.show(); } } final File outputFileLow = new File(dir.getAbsolutePath(), "testLow.mp4"); final File outputFileHigh = new File(dir.getAbsolutePath(), "testHigh.mp4"); try { outputFileLow.createNewFile(); String[] cameras = manager.getCameraIdList(); CameraCharacteristics characteristics = manager.getCameraCharacteristics(cameras[0]); StreamConfigurationMap configs = characteristics.get( CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP); Size[] sizes = configs.getOutputSizes(MediaCodec.class); final Size sizeLow = sizes[5]; final Size sizeHigh = sizes[0]; manager.openCamera(cameras[0], new CameraDevice.StateCallback() { @Override public void onOpened(CameraDevice camera) { mCamera = camera; mMediaRecorderLow.setVideoSource(MediaRecorder.VideoSource.SURFACE); mMediaRecorderLow.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4); mMediaRecorderLow.setVideoEncoder(MediaRecorder.VideoEncoder.MPEG_4_SP); mMediaRecorderLow.setVideoSize(sizeLow.getWidth(), sizeLow.getHeight()); mMediaRecorderLow.setMaxFileSize(0); mMediaRecorderLow.setOrientationHint(0); mMediaRecorderHigh.setVideoSource(MediaRecorder.VideoSource.SURFACE); mMediaRecorderHigh.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4); mMediaRecorderHigh.setVideoEncoder(MediaRecorder.VideoEncoder.MPEG_4_SP); mMediaRecorderHigh.setVideoSize(sizeHigh.getWidth(), sizeHigh.getHeight()); mMediaRecorderHigh.setMaxFileSize(0); mMediaRecorderLow.setOrientationHint(0); try { mMediaRecorderLow.setOutputFile(outputFileLow.getAbsolutePath()); mMediaRecorderHigh.setOutputFile(outputFileHigh.getAbsolutePath()); mMediaRecorderLow.prepare(); mMediaRecorderHigh.prepare(); List<Surface> list = new ArrayList<>(); list.add(mMediaRecorderLow.getSurface()); list.add(mMediaRecorderHigh.getSurface()); final CaptureRequest.Builder captureRequest = mCamera.createCaptureRequest(CameraDevice.TEMPLATE_RECORD); captureRequest.addTarget(mMediaRecorderLow.getSurface()); captureRequest.addTarget(mMediaRecorderHigh.getSurface()); mCaptureRequest = captureRequest.build(); mCamera.createCaptureSession(list, new CameraCaptureSession.StateCallback() { @Override public void onConfigured(CameraCaptureSession session) { mSession = session; } @Override public void onConfigureFailed(CameraCaptureSession session) { mSession = session; } }, null); } catch (Exception e) { e.printStackTrace(); } } @Override public void onDisconnected(CameraDevice camera) { } @Override public void onError(CameraDevice camera, int error) { } }, null); } catch (Exception e) { e.printStackTrace(); } } /** * is called by button, should start/stop recording * @param v */ public void trigger(View v) { ((Button)findViewById(R.id.button)).setText("stop"); try { if(!recording) { mMediaRecorderLow.start(); mMediaRecorderHigh.start(); mSession.setRepeatingRequest(mCaptureRequest, new CameraCaptureSession.CaptureCallback() { @Override public void onCaptureStarted(CameraCaptureSession session, CaptureRequest request, long timestamp, long frameNumber) { super.onCaptureStarted(session, request, timestamp, frameNumber); } @Override public void onCaptureCompleted(CameraCaptureSession session, CaptureRequest request, TotalCaptureResult result) { super.onCaptureCompleted(session, request, result); } }, null); ((Button)findViewById(R.id.button)).setText("stop"); recording = true; } else { ((Button)findViewById(R.id.button)).setText("start"); recording = false; mSession.stopRepeating(); mMediaRecorderHigh.stop(); mMediaRecorderLow.stop(); } } catch (CameraAccessException e) { e.printStackTrace(); } } } 

One Solution collect form web for “Capturar un video usando cámara2 y MediaRecorder”

También es necesario liberar MediaRecorder después de detener it.Same va para la configuración de Low.Try siguiente código en la parte else del método de disparo.

  mMediaRecorderHigh.stop(); mMediaRecorderHigh.reset(); mMediaRecorderHigh.release(); mCamera.release(); mMediaRecorderHigh= null; 
  • Android ACTION_IMAGE_CAPTURE con EXTRA_OUTPUT en la memoria interna
  • ¿Cómo mostrar el enfoque automático cuando la cámara de vista previa?
  • ¿Qué hardware soporta la detección de ojos y la boca?
  • setPreviewFpsRange no funciona a pesar de que los valores están dentro del rango de getPreviewFpsRange
  • Android ha desaprobado android.hardware.Camera y ahora recomendamos usar android.hardware.camera2 pero esto no está disponible en nada debajo de la API 21
  • Transmisión de vídeo en directo desde la cámara de Android al servidor
  • ¿Cómo detectar si hay cámara frontal y si hay cómo llegar y utilizar la cámara frontal?
  • ¿Puedo guardar vídeo grabado en formato flv con android?
  • Se ha producido un error al establecer la orientación
  • Vista previa de la cámara Android Cambiar entre las cámaras
  • Cómo conciliar la diferencia en la relación de aspecto entre el tamaño de vista previa de la cámara y el tamaño de la imagen
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.