设置MediaFormat.KEY_MAX_INPUT_SIZE

问题描述 投票:0回答:1

我的应用程序使用 MediaMuxer、MediaFormat 和 MediaCodec 将 PCM 文件编码为 m4a 文件。 我读了一些设置这样的代码:

MediaFormat outputFormat = MediaFormat.createAudioFormat("audio/mp4a-latm", SampleRate, 1);
outputFormat.setInteger(MediaFormat.KEY_AAC_PROFILE, MediaCodecInfo.CodecProfileLevel.AACObjectLC);
outputFormat.setInteger(MediaFormat.KEY_BIT_RATE, 96000);
outputFormat.setInteger(MediaFormat.KEY_MAX_INPUT_SIZE, 16384);

我搜索了

MediaFormat.KEY_MAX_INPUT_SIZE
,但我不清楚为什么需要设置。我读到一些三星设备在没有这个的情况下会崩溃,但我不知道这是否属实。

设置这个有必要/好/建议吗?如果是,是哪个值?

java android audio encode m4a
1个回答
0
投票

文档所述,MediaFormat.KEY_MAX_INPUT_SIZE 是缓冲区的最大大小。

较小的缓冲区会增加磁盘 IO 和其他流操作,因为它以较小的块且更频繁地刷新(用于输出)或读取(用于输入)。较大的缓冲区会降低 IO 频率,但会消耗更多内存,并且可能会在较大传输期间增加非 IO 资源使用量。

粗略地说,考虑因素与 BufferedInputStream/BufferedOutputStream 大小类似 - 通常,较大的缓冲区 = 更好的性能,减少 IO,但随着传输时 CPU 或 DMA 使用量的增加以及更长/更大的内存分配(因此太大是并不总是适合特定的用例,应该针对用例、数据和硬件有最佳的缓冲区/IO 平衡。

对于媒体格式,还有其他考虑因素,因为缓冲区太小可能会触发供应商/平台代码中的各种错误(所有这些 MediaXX 框架在许多设备上都存在极大的错误),或者在直播流的情况下速度太慢。根据平台和使用情况,默认值可能不合适。

缓冲区大小对视频解码器来说最显着的差异,对于大型、复杂的视频文件来说,不合适的、太小的缓冲区大小(固件默认值通常不适合这种情况)可能会导致 IO 操作增加数万甚至数十万的数量级,性能下降许多倍,占用资源,并触发零星且很难跟踪供应商错误和故障。

© www.soinside.com 2019 - 2024. All rights reserved.