Android Camera2+;MediaCodec+;使用持久表面的MediaMuxer?
我正在写一个摄像机应用程序。当我打开“捕获活动”时,我想配置一个启动预览的摄像头捕获会话,当用户稍后按下“录制”按钮时,它应该开始使用MediaCodec+MediaMuxer(不是MediaRecorder,因为应用程序特定的原因)录制视频,而不必重新创建新的CameraCaptureSession。我试着用它来实现这一点 到目前为止,我已经完成了预览,MediaCodec/MediaMuxer位正在生成一个“有效”的输出视频文件(根据ffprobe),但视频内容是随机对角线颜色的闪烁/加扰。在另一台设备上,相同的代码根本无法创建捕获会话。我认为问题在于,我在创建捕获会话之后创建了MediaCodec实例,这意味着当相机配置了持久化表面时,它不知道应该使用什么输出大小和颜色格式 我的问题是:我需要遵循什么样的管道才能实现我所期望的MediaCodec和持久输入界面行为 我的笔记: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实例一次。对于下一个录音,您必须创建一个新的。因此,要仅具有允许多个视频录制的单个摄像头捕获会话,需要在配置捕获会话后创建MediaCodec实例
- 所有创建的MediaCodec都必须使用同一个曲面,因为它是在相机捕获会话中指定的(是否可以更改?),因此它需要持久化
- 需要在相机捕获会话之前创建持久曲面,MediaCodec需要在相机捕获会话启动之前配置持久曲面
一点鸡和蛋的问题。有没有办法打破这种循环依赖循环?我最终通过以下操作获得了所需的行为(即使它看起来有点不正常):
- 创建持久化输入曲面
- 创建一个虚拟MediaCodec,其配置/参数与您稍后录制时使用的配置/参数完全相同,甚至可以调用
和MediaCodec::configure
(使用持久输入表面)。这将初始化持久性曲面的内部颜色/格式参数等,这是成功创建捕获会话所必需的MediaCodec::setInputSurface
- 使用持久输入表面创建所需的捕获会话
- 释放虚拟视频编码器,因为我们不再需要它了