【发布时间】:2021-04-26 17:57:27
【问题描述】:
我正在编写一个摄像机应用程序。当我打开我的捕获活动时,我想配置一个开始预览的相机捕获会话,当用户稍后按下录制按钮时,它应该开始使用 MediaCodec + MediaMuxer 录制视频(由于应用程序特定的原因而不是 MediaRecorder)无需重新创建新的 CameraCaptureSession。我尝试使用MediaCodec#createPersistentInputSurface 来实现这一点。
到目前为止,我已经完成了预览工作,MediaCodec/MediaMuxer 位正在生成一个“有效”的输出视频文件(根据 ffprobe),但视频的内容是随机对角线颜色的闪烁/加扰。在另一台设备上,相同的代码根本无法创建捕获会话。我相信问题是我在创建捕获会话之后创建 MediaCodec 实例,这意味着当相机配置有持久表面时,它不知道应该使用什么输出大小和颜色格式.
我的问题:我需要遵循什么管道才能实现我正在寻找的使用 MediaCodec 和持久输入表面的行为?
我的笔记:
-
据我测试/了解,您只能使用一次 MediaCodec 实例。对于下一个录音,您必须创建一个新录音。因此,只有一个允许多个视频录制的相机捕获会话,需要在配置捕获会话之后创建一个 MediaCodec 实例。
-
必须为所有创建的 MediaCodecs 使用相同的表面,因为它是在相机捕获会话中指定的(deferred surfaces (second bullet point) 可以更改它吗?),因此它需要持久化。
-
需要在相机捕获会话之前创建持久表面,并且 MediaCodec 需要在相机捕获会话开始之前配置持久表面...
有点鸡和蛋的问题。有没有办法打破这个循环依赖循环?
【问题讨论】:
标签: android video-capture android-camera2 android-mediacodec mediamuxer