媒体编解码器的官方文件 https://developer.android.com/reference/android/media/MediaCodec#data-types said:
数据类型
编解码器对三种数据进行操作:压缩数据、原始音频数据和原始视频数据。所有三种数据都可以使用 ByteBuffer 进行处理,但您应该使用 Surface 来处理原始视频数据,以提高编解码器性能。 Surface 使用本机视频缓冲区,而不将它们映射或复制到 ByteBuffers;因此,它的效率要高得多。使用 Surface 时通常无法访问原始视频数据,但可以使用 ImageReader 类访问不安全的解码(原始)视频帧。这可能仍然比使用 ByteBuffers 更有效,因为一些本机缓冲区可能会映射到直接 ByteBuffers 中。使用 ByteBuffer 模式时,您可以使用 Image 类和 getInput/OutputImage(int) 访问原始视频帧。
这怎么理解呢?您应该使用 Surface 来处理原始视频数据以提高编解码器性能, 什么是本机视频缓冲区?如何使用 Surface 提高编码或解码性能?
您可以使用编解码器的输入表面来编码视频帧,您可以使用以下方式获取该表面创建输入表面() https://developer.android.com/reference/android/media/MediaCodec#createInputSurface()然后(如果您不使用 NDK)您可以从表面获取画布并在其上绘制帧,或者您可以使用 NDK 并将帧数据复制到表面缓冲区,结果中的两种方法都会为您提供编码的帧数据。
至于解码,您可以在 UI 中创建一些表面并将其传递给解码器使用配置() https://developer.android.com/reference/android/media/MediaCodec#configure(android.media.MediaFormat,%20android.view.Surface,%20android.media.MediaCrypto,%20int)它将允许解码器将解码的帧渲染到表面中,因此您不需要从解码器的输出缓冲区复制解码的数据,您唯一应该做的就是传递true
作为“渲染”参数释放输出缓冲区() https://developer.android.com/reference/android/media/MediaCodec#releaseOutputBuffer(int,%20boolean)的解码器。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)