在 android 中修剪 aac-mp4 音频(mediaCodec/extractor)

Ale*_*cus 2 android mediaextractor android-mediacodec

我想修剪现有的 aac-mp4 音频文件。我第一次想“修剪” 0 个字节,基本上只是为了使用 MediaCodec/MediaExtractor 复制文件。

问题:

  1. 标题是固定大小的,我可以从旧文件中复制它吗?或者它有一些关于曲目持续时间的信息,我需要更新它?如果它有固定的大小(为了知道我应该从旧文件复制多少字节)?
  2. 我应该只使用提取器的 getSampleData(ByteBuffer, offset) 和 Advance() 还是应该使用 MediaCodec 并提取样本(解码),然后使用编码器再次对它们进行编码 - 并写入编码值?

mst*_*sjo 5

  1. 如果您使用 MediaExtractor,您可能不会自己读取原始文件,因此我看不出您打算复制哪个标题。使用 MediaExtractor + MediaMuxer 可能最容易做到这一点;只需将 MediaFormat 和从 MediaExtractor 获得的数据包复制到 MediaMuxer。

  2. 这取决于您想要如何进行修剪。完全不涉及 MediaCodec 绝对是最简单的,只需将数据包从 MediaExtractor 复制到 MediaMuxer,并在要省略的开始处跳过数据包(或seekTo()用于寻找正确的开始位置)。

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

如果您想修剪到比单个数据包允许的位置更精确的位置,您需要使用 MediaCodec 进行解码,跳过正确数量的样本,将解码器的输出帧重新打包为编码器的新完整帧,然后对其进行编码。