Невозможно воспроизвести MP4-видео с Android-рекордера - PullRequest
0 голосов
/ 08 февраля 2019

Я создаю приложение 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)
...