Android-видеомагнитофон: не удалось получить поверхность

Привет, я пытаюсь использовать API-интерфейс камеры v2 для записи видео с помощью устройства Raspberry Pi 3, в котором используется модуль камеры Raspberry Pi.

Я разрабатываю это с помощью Android Things с Kotlin.

Вот как выглядит мой код видеозаписи.

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 configured failed") } override fun onConfigured(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 

}

Это моя стратегия

  1. Получите список идентификаторов камеры, используя диспетчер камеры.
  2. Откройте первую камеру из списка (имеется только одна камера
  3. при открытии успешно создать поток обработчика
  4. Создайте mediaRecorder со всеми необходимыми параметрами (источник видео, частота кадров и т. Д.
  5. Получите поверхностный объект из mediaRecorder (где он не работает)
  6. Создайте запрос захвата с поверхности с медиа-плеера и созданного ранее hanlder
  7. при успешной настройке, вызовите mediaRecorder.start чтобы начать запись видео.

Полная ошибка stacktrace, которую я получаю, ниже:

  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 configured failed 12-01 09:58:23.985 8776-8776/com.jr.survailancedropboxcam E/CameraCaptureSession: Session 0: Failed to create capture session; configuration failed 

заранее спасибо

С последней версией (AndroidThings DP 6) вы можете использовать API-интерфейс камеры v2

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

Это должно работать: https://github.com/googlesamples/android-Camera2Basic

Вы должны убедиться, что флаг установлен в true в манифесте

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

образец Camera2Basic с использованием API Camera2 и TextureView теперь работает как на устройствах, основанных на NXP, так и на Raspberry Pi (с флагом hardwareAccelerated, установленным в true)