合并两个.m4a文件或将.wav文件转换为m4a。

4
我正在寻找一种能够暂停和恢复录制的 MPEG-4 录制方法,但好像没有这样的方法。因此我决定以原始的 wave 格式进行录制,并将其转换为 .m4a 格式。请问在安卓设备中,有没有把 .wav 文件转换成 .m4a 的方法?我尝试了查找适用于安卓设备的 mencoder 端口,但没有找到相关信息。有一些关于如何在 Linux 上移植 ffmpeg 到安卓的帖子,但并不清楚如何在安卓中使用它来合并两个 .m4a 文件或者转换 .wav 文件为 .m4a 格式。
2个回答

4

“合并”音频文件可以有两种可能的意思,并且使用ffmpeg有两种不同的方法:

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

就像DVD上有一个普通音轨,以及类似评论或配音语言的另一个音轨。要使用ffmpeg和两个m4a文件执行此操作,请使用命令ffmpeg -i in-1.m4a -acodec copy out.m4a -i in-2.m4a -acodec copy -newaudio。选项的顺序很重要,因此请勿更改。

连接两个音频文件

使第二个文件在第一个文件之后立即播放。最简单的方法是使用专为音频处理设计的程序,如SoX。似乎有最近但不稳定的SoX Android端口

如果您想要在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
@Pannu:嗯,你可以从Java中作为外部程序执行ffmpeg。如果你想使用JNI调用libavcodec,我无法提供示例代码,因为我不懂Java,而且我对libavcodec API的了解也很少。但是从我处理音频的经验来看,将两个音频文件连接起来非常容易,因为它只是将一个数组附加到另一个数组上,然后将结果馈送给编码器和复用器。 - stharward

2
假设您使用相关格式和编解码器构建了ffmpeg,将wav转换为m4a就像这样简单:
ffmpeg -i in.wav out.m4a

如果你在进行音频工作,使用SoX可能会更好。

我该如何使用NDKjni将我移植到ffmpeg`的代码转换为Android? - Pannu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接