微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何了解 MediaCodec 的用户界面以提高编解码器性能?

如何解决如何了解 MediaCodec 的用户界面以提高编解码器性能?

媒体编解码器的 official document 说:

数据类型 编解码器对三种数据进行操作:压缩数据、原始音频数据和原始视频数据。所有三种数据都可以使用 ByteBuffers 进行处理,但您应该使用 Surface 处理原始视频数据以提高编解码器性能。 Surface 使用原生视频缓冲区,无需将它们映射或复制到 ByteBuffers;因此,它的效率要高得多。使用 Surface 时,您通常无法访问原始视频数据,但您可以使用 ImageReader 类访问不安全的解码(原始)视频帧。这可能仍然比使用 ByteBuffers 更有效,因为一些本机缓冲区可能会映射到直接的 ByteBuffers。使用 ByteBuffer 模式时,您可以使用 Image 类和 getInput/Outputimage(int) 访问原始视频帧。

如何理解这一点? 您应该将 Surface 用于原始视频数据以提高编解码器性能,什么是原生视频缓冲区?如何使用 Surface 提高编码或解码性能

解决方法

您可以使用编解码器的输入表面对视频帧进行编码,您可以使用 createInputSurface() 获得此表面,然后(如果您不使用 NDK)您可以从表面获取画布并在其上绘制帧或者您可以使用 NDK 并将帧数据复制到表面缓冲区,结果中的这两种方法都会为您提供编码的帧数据。

至于解码,您可以在 UI 中创建一些表面并使用 configure() 将其传递给解码器,这将允许解码器将解码的帧渲染到表面中,因此您无需从输出复制解码数据解码器的缓冲区,您唯一应该做的就是将 true 作为“render”参数传递给解码器的 releaseOutputBuffer()

,

当您使用表面时,您不必将字节缓冲区显式提供给编码器。编码器将直接从表面抓取输入数据。以下是使用它的一些示例。 BigFlake BigFlake 是最好的起点。 EncodeAndMuxTest 希望这能帮助您理解这个概念。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。