Я создаю приложение Android Things, которое записывает видео в течение времени x, используя модуль камеры rasberry pie 3 , и когда я пытаюсь открыть только что созданный файл mp4 , оно говорит, чтоневозможно воспроизвести?
Я также заметил, что все видеозаписи имеют определенный размер файла, например, 3,4 КБ, несмотря на то, что приложение вынуждено записывать дольше (10 минут)
Возможно, я не настраиваюэто правильно?Я не вижу никаких ошибок в журналах.
Вот мой код, который создает объект поверхности для использования камерой:
private fun setMediaOutputSurface(): Surface {
var file = File(context.getExternalFilesDir(null).absolutePath)
if (file.canWrite() && file.canRead()) {
Log.d("JJJ", "File location is fine")
var files = file.listFiles()
for (item in files) {
Log.d("JJJ", "File is " + item.name)
}
}
val texture = mTextureView.surfaceTexture
texture.setDefaultBufferSize(mTextureView.width, mTextureView.height)
val surfaces = ArrayList<Surface>()
val surfacePreview = Surface(texture)
mediaRecorder = MediaRecorder().apply {
setVideoSource(MediaRecorder.VideoSource.SURFACE)
setOutputFormat(MediaRecorder.OutputFormat.MPEG_4)
setOutputFile(context.filesDir.absolutePath + "/" + System.currentTimeMillis() + ".mp4")
setVideoEncoder(MediaRecorder.VideoEncoder.H264)
setVideoSize(1920, 1080)
setVideoFrameRate(30)
setVideoEncodingBitRate(512 * 1000)
setPreviewDisplay(surfacePreview)
prepare()
Log.d("JJJ", "Finished preparing on file path " + context.filesDir.absolutePath + "/" + System.currentTimeMillis() + ".mp4")
}
return mediaRecorder.surface
}
Это обратный вызов состояния камеры
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()
Log.d("JJJ", "About to create capture session")
camera.createCaptureRequest(TEMPLATE_RECORD).build()
camera.createCaptureSession(Collections.singletonList(mediaRecorderSurface), cameraCaptureSessionCallBack, handler)
Log.d("JJJ", "Created thread handler and capture session")
}
}
Это функция, которая начинает запись
override fun startRecording(videoCameraCallback: VideoCameraCallback, textureView: TextureView) {
mTextureView = textureView
val cameraIdList = cameraManager.cameraIdList
val cameraCharacteristics = cameraManager.getCameraCharacteristics(cameraIdList[0])
cameraManager.openCamera(cameraIdList[0], cameraStateCalback, null)
Log.d("JJJ", "start recording called")
}
Это остановка записи
override fun stopRecording() {
mediaRecorder.stop()
mediaRecorder.release()
Log.d("JJJ", "stop recording called")
}
И, наконец, так все и начинается
videoCameraRecorder = VideoCameraRecorder(applicationContext)
Handler().postDelayed({
videoCameraRecorder.startRecording( object : VideoCameraCallback {
override fun onFinishedRecordingSuccess() {
Log.d(TAG, "onFinishedRecordingSuccess")
}
override fun onFinishedRecordingFailure() {
Log.d(TAG, "onFinishedRecordingFailure")
}
}, textureView)
Handler().postDelayed({
videoCameraRecorder.stopRecording()
}, 100000)
}, 5000)