【问题标题】:Appending multiple videos via MediaCodec - about multiple MediaExtractors and Decoders for just one Encoder通过 MediaCodec 附加多个视频 - 关于一个编码器的多个 MediaExtractors 和解码器
【发布时间】:2016-10-10 16:50:27
【问题描述】:

目前我正在尝试将多个视频文件连接在一起,最简单的方法是使用MP4Parser。但是,MP4Parser 必须使视频具有相同的尺寸和帧率,因为它只是在操作容器。

fadden 说 MP4 支持可变帧率视频,MediaCodec 可以生成它们,所以我正在考虑使用MediaCodec 套件来完成这项任务。

假设我有 3 个视频要连接,我正在考虑拥有 3 个 MediaExtractorsMediaCodec 解码器实例,每个视频一个,一个 MediaCodec 编码器将解码的缓冲区放入最终视频文件。

提取器和解码器将一个接一个地单独运行,并将它们输入同一个编码器。但是,我担心编码器的 EOS 信号标志。

我可以在第三个解码器完成之前保持所述信号标志关闭吗?我还应该使用循环缓冲区来完成这项任务吗?

【问题讨论】:

    标签: android video android-mediacodec


    【解决方案1】:

    是的,您可以随时发送 EOS 信号标志,只要您此后不向编码器发送新帧。事实上,如果你还想喂更多的视频帧,你不应该发送 EOS 标志

    您可能想知道的几件事:

    1. 释放第一个解码器后配置第二个解码器更安全, 某些设备可能不允许您分配多个解码器,尤其是在解码高分辨率视频时。

    2. 您应该在第二个和第三个视频的演示时间上添加偏差(显然)

    3. 是的,MediaCodec 支持可变帧率,但我不确定它是否支持可变尺寸。您可能需要自己进行一些调整大小或裁剪(通过 OpenGL 渲染)

    【讨论】:

    • 在开始时生成所有必要的MediaExtractor 和解码器MediaCodec 对怎么样?例如,如果我必须连接 4 个视频,我会生成 4 个 MediaExtractors 和 MediaCodecs,每个视频一对,让它们将缓冲区推送到单个编码器 MediaCodec,然后依次运行每个。走这条路会不会有OutOfMemory异常之类的副作用?
    • 正如我所说,一次使用过多的 MediaCodec 解码器实例可能会遇到麻烦,此外,您只能在从第一个视频输入帧后才能从第二个视频输入帧,(顺序您提供给编码器的帧应该按照您希望它们出现在结果视频中的顺序)。或者这样做有什么好处?
    • 我确实像你说的那样,使用 Extractor-Decoder 对将视频帧提供给编码器,然后在第一个视频完成后迭代到下一个视频。 mstorsjo 说一次运行多个解码器实例可能会有好处(比如当您想在最终输出中并排显示两个视频时),但代码会有点复杂。
    • 是的,如果要并排显示视频,则必须同时运行多个解码器(在某些设备上可能会失败,解码多个 1080p 视频可能会导致旧设备出错(除非您使用软件解码器))。但是,如果您只想连接它,则没有理由冒险。
    • 我决定在发布之前的实例后尝试创建 MediaExtractor 和 MediaCodec 的新实例 - 如果我必须将四个以上的视频连接在一起,则多实例方法不起作用。我是在处理循环内还是在处理循环外生成实例?
    猜你喜欢
    • 2014-08-27
    • 1970-01-01
    • 1970-01-01
    • 2014-09-04
    • 2018-11-19
    • 1970-01-01
    • 2019-06-21
    • 2014-04-30
    • 1970-01-01
    相关资源
    最近更新 更多