我想修剪现有的AAC-MP4音频文件。我第一次想“修剪”0个字节,基本上只是为了使用mediacodec/mediaextractor复制文件。
问题:
头是固定大小的,我可以从旧文件复制吗?或者它有一些关于赛道持续时间的信息,我需要更新它?如果它的大小是固定的(为了知道应该从旧文件复制多少字节)?
我应该只使用提取器的getSampleData(byteBuffer,offset)和advance()还是还应该使用mediacodec提取样本(decode),然后用编码器再次对它们进行编码-然后写入编码的值?

最佳答案

如果使用mediaextractor,您可能不会自己读取原始文件,因此我看不到您打算复制的头。这可能是使用MediaExtractor+MediaMuxer最简单的方法;只需将MediaFormat和从MediaExtractor获取的数据包复制到MediaMuxer即可。
这取决于你想怎么修剪。最简单的方法是完全不使用mediacodec,只需将数据包从mediaextractor复制到mediamuxer,并在开始时跳过要忽略的数据包(或者使用seekTo()来寻找正确的开始位置)。
但请记住,音频帧有一定的长度;对于aac-lc,通常是1024个采样,对于48khz的音频来说是21毫秒。因此,如果只复制单个数据包,那么在48khz的情况下,不能获得比21毫秒更接近的微调粒度。这在大多数情况下可能是可以的,但是如果音频的采样率较低,比如8 kHz,那么粒度最终会高达128 ms。
如果要修剪到比单个数据包允许的更精确的位置,则需要使用mediacodec进行解码,跳过适当数量的样本,将解码器中的输出帧重新打包为编码器的新的完整帧,并对其进行编码。

10-07 22:20