【问题标题】:Merge two .m4a files or convert .wav file to m4a合并两个 .m4a 文件或将 .wav 文件转换为 m4a
【发布时间】:2011-12-23 12:07:57
【问题描述】:

我一直在寻找一种在 mpeg-4 中录制并具有暂停和恢复功能的方法,但似乎没有。所以我决定以原始wave 格式记录并转换为.m4a。有没有办法可以在android中将.wav文件转换为.m4a。我四处寻找Android的mencoder端口,但没有找到,有一些关于在linux上将ffmpeg移植到android的帖子,但我不太清楚如何在android中使用它来合并两个.m4a文件或将.wav 文件转换为.m4a

【问题讨论】:

    标签: java android ffmpeg mencoder mpeg-4


    【解决方案1】:

    “合并”音频文件可能意味着两种可能的情况,以及使用 ffmpeg 的两种不同方法:

    将两个单独的音轨放入同一个文件中

    就像在 DVD 上一样,其中有一个普通的音轨,还有另一个音轨,如评论或配音语言。要使用 ffmpeg 和两个 m4a 文件执行此操作,请使用命令 ffmpeg -i in-1.m4a -acodec copy out.m4a -i in-2.m4a -acodec copy -newaudio。选项的顺序很重要,所以不要乱来。

    连接两个音频文件

    在第一个文件之后立即播放第二个文件。最简单的方法是使用专为音频处理设计的程序,如SoX。似乎有a recent but unstable Android port of SoX

    如果你想在ffmpeg中严格进行串联,那么你可以执行以下操作:

    1. ffmpeg -i in-1.m4a -f s16le in-1.raw
      这会将音频文件输出到原始 PCM。您需要注意采样率和通道数,因为这些信息不会存储在原始 PCM 文件中,稍后您将需要它。 ffmpeg 将在重新编码时向您显示音频流信息。它看起来像Audio: aac, 44100 Hz, stereo, s16, 63 kb/s,这意味着您的采样率为44100,您的通道数为2(立体声)。大多数情况下,您将处理 22050、44100 或 48000 的采样率;和 1 个(“单声道”)、2 个(“立体声”)或 6 个(“5.1”)通道。

    2. ffmpeg -i in-2.m4a -f s16le in-1.raw
      现在将第二个文件解码为原始 PCM。

    3. ffmpeg -f s16le -ar 44100 -ac 2 -i 'concat:in-1.raw|in-2.raw' -acodec libfaac out.m4a
      同样,选项的顺序非常重要。根据您的输入更改采样率 (-ar) 和通道 (-ac) 选项。

    【讨论】:

    • 这些命令不应该在命令行中运行吗?我将ffmpeg 移植到 android 现在我需要知道如何使用JNI 或其他东西来做同样的事情
    • @Pannu:好吧,您可以将 ffmpeg 作为 Java 的外部程序执行。如果您想使用 JNI 调用 libavcodec,我无法为您提供示例代码,因为我不懂 Java,而且我几乎不知道 libavcodec API。但是从我对音频处理的一些了解来看,连接两个音频文件真的很容易,因为它只是将一个数组附加到另​​一个数组,然后将结果提供给编码器和复用器。
    【解决方案2】:

    假设你用相关格式和编解码器构建ffmpeg,将wav转换为m4a很简单:

    ffmpeg -i in.wav out.m4a
    

    如果您从事音频工作,使用SoX 可能会更好。

    【讨论】:

    • 如何使用NDKjni 进行转换,我已将ffmpeg 移植到android