编辑音频/重新录制文件的一部分

Cha*_*ltz 2 android

我希望用户能够在应用程序中录制音频,然后能够选择文件的一部分并重新录制它。例如,也许他们最初录制“How now, brown cow”,然后选择结尾并重新录制“皱眉母猪”。这将合并到初始文件中,然后将是“How now, frown sow”。

这似乎比我预期的要困难得多。我可以使用 3GP 格式文件执行此操作吗?如果没有,我如何将它们转换为我需要的格式?

我希望能够说“获取这个刚刚录制的音频文件。它将填充这个其他媒体文件的 5 秒到 10 秒部分,现在保存新的、编辑过的文件。” 我收集毫秒、帧、样本和字节之间的转换可能会使这变得更加复杂。

我正在检查 Ringdroid 应用程序(我非常感谢它是开源的!)它至少做了类似的事情,但是非常复杂,几乎没有评论......希望它比我需要的要复杂得多。

我确实看到了另一个线程,但即使这是我需要的,我也不相信这些类是 Android 的一部分:保存音频文件的一部分(Java)

Cha*_*ltz 5

我终于能够编辑部分 3GP 文件了。

我使用了来自 RingDroid 的CheapAMR(也管理3GP)和CheapSoundFile 类,以及一个新的“AudioFileHandler”类。

一路上我学到了一些重要的教训:

  • 一个 3GP 文件被分成“盒子”。每个框包含一个值,说明框的长度,然后是一些数据。有一个包含有关 3GP 文件元数据的“ftyp”框,一个包含实际音乐数据的“mdat”框,以及一个包含电影数据的“moov”框(即使是纯音频文件也有这个框。”
  • 文件中框的顺序及其各自的大小,从 Android 设备更改为 Android 设备
  • 音乐数据本身分为“帧”(在我使用 3GP 的测试中为 32 字节,但我认为它可能具有不同的长度)。通过替换或添加帧来更改文件,而不是通过编辑帧的字节。
  • 在进行此类编码时,十六进制编辑器是非常有用的工具
  • RingDroid 有一些错误;它没有准确报告帧数等,因此必须编写黑客来解决这个问题
  • 更改音频文件的长度时,请确保保持 ftyp 和 moov 框不变,并更改文件中紧接在“mdat”之前的四个字节。这表示以字节为单位的 mdat 框的长度,包括 mdat 标头本身的八个字节。