繁体   English   中英

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

[英]Android Camera2 + MediaCodec + MediaMuxer using persistent surface?

我正在编写一个摄像机应用程序。 当我打开我的捕获活动时,我想配置一个开始预览的相机捕获 session,当用户稍后按下录制按钮时,它应该开始使用 MediaCodec + MediaMuxer 录制视频(不是 MediaRecorder 出于应用程序特定的原因)重新创建一个新的 CameraCaptureSession。 我尝试使用MediaCodec#createPersistentInputSurface来实现这一点。

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

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

我的笔记:

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

  • 所有创建的 MediaCodecs 必须使用相同的表面,因为它在相机捕获 session 中指定( 延迟表面(第二个要点)可以改变这个吗?),因此为什么它需要持久化。

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

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

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

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

从那里开始,您可以保留一个相同的相机捕获 session 并在每次您想要录制某些内容时创建新的 MediaCodecs,但它们总是需要像虚拟的那样配置,否则可能会出现录制问题。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM