Grabador de video Android: no se pudo get la superficie

Hola, estoy tratando de usar la API de la camera v2 para grabar videos usando un dispositivo Raspberry Pi 3 que usa el module de la camera Raspberry Pi que tiene.

Estoy desarrollando esto usando Android Things con Kotlin.

Así es como se ve mi código de grabación de video.

override fun startRecording(videoCameraCallback: VideoCameraCallback) { val cameraIdList = cameraManager.cameraIdList cameraManager.openCamera(cameraIdList[0], cameraStateCalback, null) Log.d("JJJ", "start recording called") } var cameraStateCalback = object : CameraDevice.StateCallback() { override fun onOpened(camera: CameraDevice?) { if (camera != null) { Log.d("JJJ", "onOpened and will now create handler and capture session") //create handler thread val thread = HandlerThread("MyHandlerThread") thread.start() val handler = Handler(thread.looper) //create capture session val mediaRecorderSurface = setMediaOutputSurface() val surfaces = ArrayList<Surface>() surfaces.add(mediaRecorderSurface) captureRequest = camera.createCaptureRequest(TEMPLATE_RECORD).build() camera.createCaptureSession(surfaces, cameraCaptureSessionCallBack,handler) Log.d("JJJ", "Created thread handler and capture session") } } override fun onDisconnected(camera: CameraDevice?) { Log.d("JJJ", "on disconnected") } override fun onError(camera: CameraDevice?, error: Int) { Log.d("JJJ", "on error") } } var cameraCaptureSessionCallBack = object : CameraCaptureSession.StateCallback(){ override fun onConfigureFailed(session: CameraCaptureSession?) { Log.d("JJJ", "on configunetworking failed") } override fun onConfigunetworking(session: CameraCaptureSession?) { Log.d("JJJ", "start recording") mediaRecorder.start() } } private fun setMediaOutputSurface(): Surface { var file = File(context.filesDir.absolutePath) if(file.canWrite() && file.canRead()){ Log.d("JJJ", "File location is fine") } mediaRecorder = MediaRecorder() mediaRecorder.setVideoSource(MediaRecorder.VideoSource.SURFACE) //changed this to surface from camera and it fixed the cant get surface error mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4) mediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264) mediaRecorder.setVideoSize(600,600) // mediaRecorder.setVideoEncodingBitRate(10000000) // mediaRecorder.setVideoEncodingBitRate(512 * 1000) mediaRecorder.setOutputFile(context.filesDir.absolutePath + "/"+System.currentTimeMillis() + ".mp4") mediaRecorder.setVideoFrameRate(30) mediaRecorder.prepare() // mediaRecorder.start() return mediaRecorder.surface 

}

Esta es mi estrategia

  1. Obtenga una list de ID de cameras usando el administrador de la camera.
  2. Abra la primera camera de la list (solo hay una camera adjunta
  3. cuando se abre con éxito, crea el hilo del controller
  4. Crea mediaRecorder con todos los parameters necesarios (fuente de video, framerate, etc.
  5. Obtiene el object de superficie del mediaRecorder (donde falla)
  6. Crear request de captura con la superficie del reproductor multimedia y el dispositivo creado previamente
  7. una vez configurado correctamente, llame a mediaRecorder.start para comenzar a grabar video.

El error de stacktrace completo que obtengo es el siguiente:

  12-01 09:58:23.981 8776-8776/com.jr.survailancedropboxcam W/CameraDevice-JV-0: Stream configuration failed due to: endConfigure:372: Camera 0: Unsupported set of inputs/outputs provided 12-01 09:58:23.985 8776-8958/com.jr.survailancedropboxcam D/JJJ: on configunetworking failed 12-01 09:58:23.985 8776-8776/com.jr.survailancedropboxcam E/CameraCaptureSession: Session 0: Failed to create capture session; configuration failed 

Gracias por adelantado

    Con la última versión (AndroidThings DP 6) puede usar las API de Camera v2

    https://android-developers.googleblog.com/2017/11/android-things-developer-preview-6.html

    Esto debería funcionar: https://github.com/googlesamples/android-Camera2Basic

    Debes asegurarte de que tienes el marcador establecido en verdadero en el manifiesto

     <activity ... android:hardwareAccelerated="true"> 

    el ejemplo de Camera2Basic que usa Camera2 API y TextureView ahora funciona en dispositivos basados ​​en NXP y Raspberry Pi (con el indicador hardwareAccelerated establecido en verdadero)