2

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

问题:

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

1 回答 1

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 毫秒。

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

于 2017-01-13T14:05:23.647 回答