Android录像机:未能获得表面
您好我正在尝试使用相机v2 API来记录video使用Raspberry Pi 3设备,使用树莓派相机模块附加到它。
我正在用Kotlin使用Android Things开发这个function。
这是我的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() 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
}
这是我的策略
- 使用相机管理器获取相机ID的列表。
- 从列表中打开第一台相机(只有一台相机连接
- 当成功打开时,创建处理程序线程
- 创建
mediaRecorder
所有必要的参数(video源,帧率等 - 从
mediaRecorder
获取表面对象(失败的地方) - 使用之前创建的媒体播放器和hanlder创建捕捉请求
- 如果配置成功,请调用
mediaRecorder.start
开始录制video。
我得到的完整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),您可以使用Camera v2 API
https://android-developers.googleblog.com/2017/11/android-things-developer-preview-6.html
这应该工作: https : //github.com/googlesamples/android-Camera2Basic
您需要确保在清单中将标志设置为true
使用Camera2 API和TextureView的Camera2Basic示例现在可以在基于NXP和Raspberry Pi的设备上运行(hardwareAccelerated标志设置为true)