gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 23:59:30 27 4
gpt4 key购买 nike

我正在编写一个摄像机应用程序。当我打开我的捕捉 Activity 时,我想配置一个开始预览的相机捕捉 session ,当用户稍后按下录制按钮时,它应该开始使用 MediaCodec + MediaMuxer 录制视频(由于特定于应用程序的原因而不是 MediaRecorder)无需 重新创建新的 CameraCaptureSession。我尝试使用 MediaCodec#createPersistentInputSurface使这成为可能。

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

我的问题:我需要遵循什么管道才能实现我在使用 MediaCodec 和持久输入表面寻找的行为?

我的笔记:

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

  • 所有创建的 MediaCodec 必须使用相同的表面,因为它是在相机捕获 session 中指定的(deferred surfaces (second bullet point) 可以改变这个吗?),因此它需要持久化。

  • 需要在相机捕获 session 之前创建持久表面,并且 MediaCodec 需要在相机捕获 session 开始之前配置持久表面...

有点像先有鸡还是先有蛋的问题。有没有办法打破这种循环依赖循环?

最佳答案

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

  • 创建持久输入界面
  • 创建一个虚拟 MediaCodec,其配置/参数与您稍后将使用的配置/参数完全相同,直至调用 MediaCodec::configureMediaCodec::setInputSurface (使用持久输入表面)。这会初始化持久性表面的内部颜色/格式参数等,这是成功创建捕获 session 所必需的。
  • 使用持久输入表面创建所需的捕获 session
  • 释放虚拟视频编码器,因为我们不再需要它

从那时起,您可以保持同一个摄像头捕获 session ,并在每次要录制内容时创建新的 MediaCodec,但它们始终需要像虚拟的一样进行配置,否则可能会出现录制问题。

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

关于Android Camera2 + MediaCodec + MediaMuxer 使用持久表面?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65842243/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com