【问题标题】:Android Camera2 + MediaCodec + MediaMuxer using persistent surface?Android Camera2 + MediaCodec + MediaMuxer 使用持久表面?
【发布时间】: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


    【解决方案1】:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2021-04-15
      • 1970-01-01
      • 2013-09-22
      • 2013-10-05
      • 1970-01-01
      • 2014-07-21
      • 2016-04-25
      • 1970-01-01
      • 2017-04-22
      相关资源
      最近更新 更多