问题描述
我想为 Android(如 FL、GarageBand 等)创建一个简单的音频音序器应用程序。但是,我一直在处理音频。特别是,我应该如何实现音频播放(即播放录制的音频),有没有可以使用的库,还是只使用默认的 Java 方法更好?最近我找到了双簧管,但我不确定它是否适合这个目的。
我使用原始文件作为音频源(如钢琴音符)并使用 AudioTrack 访问它们。
解决方法
如果音频输出的 android 环境类似于 Java,那么获得准确计时的最佳方法是计算 PCM 帧数并使用它来保持所有元素对齐。我没有对 Android 做过很多事情,但我认为用于输出的类是 AudioTrack
,因为它允许您流式传输 PCM。我会考虑确保您的所有声音都可以转换为 PCM 并使用该数据形式进行混音和效果处理,然后通过 AudioTrack
输出。
我没看过双簧管。也许它已经构建了所需的一切。我是老派——我最近才学会寻找图书馆而不是重新发明轮子。
这里有一个 previous question,它谈到了一些关于输出 PCM 的内容。
,在 Android 上,对于原生音频应用,我建议使用双簧管。 打开单个输出流,然后将所有音轨混合到一个单个流中。正如另一个 Phil 建议的那样,使用帧数作为计时参考。
您可以使用 DrumThumper 应用作为起点,因为它将多个 WAV 样本混合到一个输出中。
,您也可以看看我正在开发的这个库:https://github.com/WaveBeans/wavebeans
它允许您混合不同的样本文件,但播放部分您需要作为自定义输出自行完成。它在 Kotlin 上运行,目前不确定它是否可以与 Java 无缝协作。
代码看起来像这样(对于预定义的混合):
val silence = input { ZeroSample }
val sample1 = wav("file://sample1.wav")
val sample2 = wav("file://sample1.wav")
val track1 = sample1..silence.trim(100,MILLISECONDS)..sample1
val track2 = sample2..silence.trim(10,MILLISECONDS)..sample2..silence.trim(10,MILLISECONDS)..sample2
val mix = track1 + track2
mix.out {
/**
* here is the output code to perform the playback
* follow https://wavebeans.io/docs/api/outputs/output-as-a-function.html
*/
}
// and evaluate the output as by https://wavebeans.io/docs/exe/