Trim android (mediaCodec/extractor) 中的 aac-mp4 音频

Trim aac-mp4 audio in android (mediaCodec/extractor)

我想要 trim 现有的 aac-mp4 音频文件。第一次想"trim" 0字节,基本上就是用MediaCodec/MediaExtractor.

复制文件

问题:

  1. header 是固定大小的,我可以从旧文件中复制它吗?或者它有一些关于曲目持续时间的信息,我需要更新它?如果它有固定大小(为了知道我应该从旧文件复制多少字节)?
  2. 我应该只使用提取器的 getSampleData(ByteBuffer, offset) 和 advance() 还是我也应该使用 MediaCodec 并提取样本(解码)然后用编码器再次对它们进行编码 - 并写入编码值?
  1. 如果您使用 MediaExtractor,您可能不会自己读取原始文件,所以我不明白 header 您打算复制什么。这可能是使用 MediaExtractor + MediaMuxer 最简单的方法;只需将从 MediaExtractor 获得的 MediaFormat 和数据包复制到 MediaMuxer。

  2. 这取决于您想如何进行 trimming。根本不涉及 MediaCodec 绝对最简单,只需将数据包从 MediaExtractor 复制到 MediaMuxer,然后跳过要忽略的开头的数据包(或使用 seekTo() 寻找正确的起始位置)。

但请记住,音频帧有一定的长度;对于 AAC-LC 它通常是 1024 个样本,对于 48 kHz 音频是 21 毫秒。因此,如果您只复制单个数据包,对于 48 kHz,您无法获得比 21 毫秒更接近 trimming 的粒度。这在大多数情况下可能没问题,但如果音频的采样率较低,比如 8 kHZ,则粒度最终会高达 128 毫秒。

如果你想 trim 到比单个数据包允许的更精确的位置,你需要使用 MediaCodec 解码,跳过适量的样本,将解码器的输出帧重新打包成新的完整帧对于编码器,并对其进行编码。