带有OpenGL的MediaRecorder曲面输入-如果启用了音频录制,则会出现此问题

问题描述

我想用MediaRecorder代替MediaCodec来录制视频,因为众所周知,它很容易使用。

我还想在录制时使用OpenGL处理​​帧

然后,我使用Grafika的ContinuousCaptureActivity示例中的示例代码来初始化EGL渲染上下文,创建cameraTexture并将其作为Surface https://github.com/google/grafika/blob/master/app/src/main/java/com/android/grafika/ContinuousCaptureActivity.java#L392传递给Camera2 API

并从我们的encodeSurface https://github.com/google/grafika/blob/master/app/src/main/java/com/android/grafika/ContinuousCaptureActivity.java#L418

创建EGLSurface recorderSurface

依此类推(处理帧与Grafika示例中的帧相同,与示例代码Grafika代码中的所有内容相同)

然后,当我开始录制(MediaRecorder.start())时,如果未设置音频源,它会录制好视频

但是如果还启用了录音

mediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC)
...
mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC)

然后,最终视频的时长(长度)很大,因此无法真正播放。因此,使用Surface作为输入和使用GLES添加和处理帧时,MediaRecorder音频编码器会毁掉一切

我不知道如何解决它。

这是我处理框架的代码(基于Grafika示例,几乎相同):

class GLCameraFramesRender(
    private val width: Int,private val height: Int,private val callback: Callback,recorderSurface: Surface,eglCore: EglCore
) : OnFrameAvailableListener {
    private val fullFrameBlit: FullFrameRect
    private val textureId: Int
    private val encoderSurface: WindowSurface
    private val tmpMatrix = FloatArray(16)
    private val cameraTexture: SurfaceTexture
    val cameraSurface: Surface

    init {
        encoderSurface = WindowSurface(eglCore,recorderSurface,true)
        encoderSurface.makeCurrent()

        fullFrameBlit = FullFrameRect(Texture2dProgram(Texture2dProgram.ProgramType.TEXTURE_EXT))

        textureId = fullFrameBlit.createTextureObject()

        cameraTexture = SurfaceTexture(textureId)
        cameraSurface = Surface(cameraTexture)
        cameraTexture.setOnFrameAvailableListener(this)
    }

    fun release() {
        cameraTexture.setOnFrameAvailableListener(null)
        cameraTexture.release()
        cameraSurface.release()
        fullFrameBlit.release(false)
        eglCore.release()
    }

    override fun onFrameAvailable(surfaceTexture: SurfaceTexture) {
        if (callback.isRecording()) {
            drawFrame()
        } else {
            cameraTexture.updateTexImage()
        }
    }

    private fun drawFrame() {
        cameraTexture.updateTexImage()

        cameraTexture.getTransformMatrix(tmpMatrix)


        GLES20.glViewport(0,width,height)

        fullFrameBlit.drawFrame(textureId,tmpMatrix)

        encoderSurface.setPresentationTime(cameraTexture.timestamp)

        encoderSurface.swapBuffers()
       
    }

    interface Callback {
        fun isRecording(): Boolean
    }
}

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)