Android Camera2+;MediaCodec+;使用持久表面的MediaMuxer?

Android Camera2+;MediaCodec+;使用持久表面的MediaMuxer?,android,video-capture,android-camera2,android-mediacodec,mediamuxer,Android,Video Capture,Android Camera2,Android Mediacodec,Mediamuxer,我正在写一个摄像机应用程序。当我打开“捕获活动”时,我想配置一个启动预览的摄像头捕获会话,当用户稍后按下“录制”按钮时,它应该开始使用MediaCodec+MediaMuxer(不是MediaRecorder,因为应用程序特定的原因)录制视频,而不必重新创建新的CameraCaptureSession。我试着用它来实现这一点 到目前为止,我已经完成了预览,MediaCodec/MediaMuxer位正在生成一个“有效”的输出视频文件(根据ffprobe),但视频内容是随机对角线颜色的闪烁/加扰。

我正在写一个摄像机应用程序。当我打开“捕获活动”时,我想配置一个启动预览的摄像头捕获会话,当用户稍后按下“录制”按钮时,它应该开始使用MediaCodec+MediaMuxer(不是MediaRecorder,因为应用程序特定的原因)录制视频,而不必重新创建新的CameraCaptureSession。我试着用它来实现这一点

到目前为止,我已经完成了预览,MediaCodec/MediaMuxer位正在生成一个“有效”的输出视频文件(根据ffprobe),但视频内容是随机对角线颜色的闪烁/加扰。在另一台设备上,相同的代码根本无法创建捕获会话。我认为问题在于,我在创建捕获会话之后创建了MediaCodec实例,这意味着当相机配置了持久化表面时,它不知道应该使用什么输出大小和颜色格式

我的问题是:我需要遵循什么样的管道才能实现我所期望的MediaCodec和持久输入界面行为

我的笔记:

  • 据我测试/了解,您只能使用MediaCodec实例一次。对于下一个录音,您必须创建一个新的。因此,要仅具有允许多个视频录制的单个摄像头捕获会话,需要在配置捕获会话后创建MediaCodec实例

  • 所有创建的MediaCodec都必须使用同一个曲面,因为它是在相机捕获会话中指定的(是否可以更改?),因此它需要持久化

  • 需要在相机捕获会话之前创建持久曲面,MediaCodec需要在相机捕获会话启动之前配置持久曲面


一点鸡和蛋的问题。有没有办法打破这种循环依赖循环?

我最终通过以下操作获得了所需的行为(即使它看起来有点不正常):

  • 创建持久化输入曲面
  • 创建一个虚拟MediaCodec,其配置/参数与您稍后录制时使用的配置/参数完全相同,甚至可以调用
    MediaCodec::configure
    MediaCodec::setInputSurface
    (使用持久输入表面)。这将初始化持久性曲面的内部颜色/格式参数等,这是成功创建捕获会话所必需的
  • 使用持久输入表面创建所需的捕获会话
  • 释放虚拟视频编码器,因为我们不再需要它了
从那时起,您可以保持同一个摄像头捕获会话,并在每次需要录制内容时创建新的MediaCodec,但它们始终需要像虚拟视频一样进行配置,否则可能会出现录制问题

旁注:在这个问题上,我认为延迟曲面可能会有所帮助,但我现在完全理解它们,不,它们对解决这个特定问题没有帮助