Camera2 MediaRecorder — Как записывать в формате WebM?

#android #android-camera2 #mediarecorder #webm

#Android #android-camera2 #mediarecorder #webm

Вопрос:

Я хочу записать видео в формате WebM с Camera2 помощью и MediaRecorder .

Для этого я использую пример кода Camera2Video на Github. В примере показан способ записи в формате mp4 с использованием задней или фронтальной камеры.

Настройка MediaRecorder выполняется одним способом:

     /** Creates a [MediaRecorder] instance using the provided [Surface] as input */
    private fun createRecorder(surface: Surface) = MediaRecorder().apply {
        setAudioSource(MediaRecorder.AudioSource.MIC)
        setVideoSource(MediaRecorder.VideoSource.SURFACE)
        setOutputFormat(MediaRecorder.OutputFormat.MPEG_4)
        setOutputFile(outputFile.absolutePath)
        setVideoEncodingBitRate(RECORDER_VIDEO_BITRATE)
        if (args.fps > 0) setVideoFrameRate(args.fps)
        setVideoSize(args.width, args.height)
        setVideoEncoder(MediaRecorder.VideoEncoder.H264)
        setAudioEncoder(MediaRecorder.AudioEncoder.AAC)
        setInputSurface(surface)
    }
 

И то, что я пытаюсь сделать, это найти дурацкую конфигурацию для записи webm

     private fun createRecorder(surface: Surface) = MediaRecorder().apply {
        setAudioSource(MediaRecorder.AudioSource.MIC)
        setVideoSource(MediaRecorder.VideoSource.SURFACE)
        setOutputFormat(MediaRecorder.OutputFormat.WEBM)
        setOutputFile(outputFile.absolutePath)
        setVideoEncodingBitRate(RECORDER_VIDEO_BITRATE)
        if (args.fps > 0) setVideoFrameRate(args.fps)
        setVideoSize(args.width, args.height)
        setVideoEncoder(MediaRecorder.VideoEncoder.VP8)
        setAudioEncoder(MediaRecorder.AudioEncoder.VORBIS)
        setInputSurface(surface)
    }
 

Но, делая это, я сталкиваюсь с катастрофой:

2020-12-09 14:59:26.560 28899-28899/com.android.example.camera2.video С CameraDevice-JV-0: сбой настройки потока из-за: endConfigure: 543: Камера 0: предоставлен неподдерживаемый набор входов / выходов 2020-12-09 14:59:26.564 28899-28899/com.android.example.camera2.video E/ CameraCaptureSession: сеанс 0: не удалось создать сеанс захвата; сбой конфигурации 2020-12-09 14:59:26.566 28899-28945/com.android.example.camera2.video E/CameraFragment: сбой настройки сеанса камеры 0 java.lang.RuntimeException: сбой настройки сеанса камеры 0 на com.example.android.камера 2.видео.фрагменты.CameraFragment$createCaptureSession$$inlined$suspendCoroutine$lambda$1.onConfigureFailed(CameraFragment.kt:375 ) в android.hardware.camera2.impl.CallbackProxies$SessionStateCallbackProxy.lambda$onConfigureFailed$1(CallbackProxies.java:64 ) на android.hardware.camera2.impl.-$$Lambda$Обратные вызовы $SessionStateCallbackProxy $ gvbTsp9UPpKJAbdycdci_ZW5BeI.run(Неизвестный источник: 4) на android.os.Handler.handleCallback(Handler.java:907) на android.os.Handler.DispatchMessage(Handler.java: 105) на android.os.Looper.loop(Looper.java: 216) на android.os.HandlerThread.run(HandlerThread.java:65) 2020-12-09 14:59:26.607 28899-28899/com.android.example.camera2.video E/AndroidRuntime: ФАТАЛЬНОЕ ИСКЛЮЧЕНИЕ: основной процесс: com.android.example.camera2.video, PID: 28899 java.lang.RuntimeException: сбой настройки сеанса камеры 0 в com.example.android.camera2.video.фрагменты.CameraFragment$createCaptureSession$$inlined$suspendCoroutine$lambda$1.onConfigureFailed(CameraFragment.kt:375 ) в android.hardware.camera2.impl.CallbackProxies$SessionStateCallbackProxy.lambda$onConfigureFailed$1(CallbackProxies.java:64 ) на android.hardware.camera2.impl.-$$Lambda$Обратные вызовы $SessionStateCallbackProxy $ gvbTsp9UPpKJAbdycdci_ZW5BeI.run(Неизвестный источник: 4) на android.os.Handler.handleCallback(Handler.java:907) на android.os.Handler.DispatchMessage(Handler.java: 105) на android.os.Looper.loop(Looper.java: 216) на android.os.HandlerThread.run(HandlerThread.java:65)

В первой строке говорится, что произошла неправильная настройка

Сбой настройки потока из-за: endConfigure: 543: Камера 0: предоставлен неподдерживаемый набор входов / выходов

Я также пытался прокомментировать строки об источнике звука, потому что вижу, что кодировщик Vorbis не поддерживается с теми же результатами.

Как я могу записать видео в формате WebM?

Комментарии:

1. Вероятно, кодировщик для MediaRecorder на самом деле не был создан, поэтому, когда вы пытаетесь использовать Surface из MediaRecorder с камерой, он фактически не настроен. Есть ли какие-либо выходные строки logcat, которые предполагают, что MediaRecorder столкнулся с ошибкой?

2. Больше нет выходных данных logcat. И да, на мой взгляд, это ошибка конфигурации MediaRecorder, но я не знаю, почему и что? Потому что все в порядке с параметрами MP4

3. Вы хотите, чтобы весь системный logcat, а не только logcat, ограничивался вашим собственным процессом приложения.