我正在尝试为Android编写一个音乐播放器应用程序,允许用户从歌曲中提取主唱。
所涉及的数学是这样的:
amount_of_removal * ((left * (balance)) - (right * (1 - balance))) + (1 - amount_of_removal)*(left + right)
是否有任何可能的方法将自定义AudioEffect
应用于音频流?即使我自己打开并解码文件?
好吧,当我发布这个问题时,我似乎忽略了一些相当重要的信息。
其中最主要的是,大多数音乐格式都是所谓的"有损",因为它们不会存储构成音频波形的所有内容。例如,MP3
基本上将波形分解为其分量频率,但只存储最响亮的频率,而丢弃较安静的频率。
再加上这样一个事实,对于几种风格的音乐,主唱是声音最大的部分(尤其是当他们唱歌的时候),你的音质也有一些问题,因为现在需要一些更安静的频率,因为主唱不在那里掩盖它。
这意味着最好的读取格式实际上是无损的,其中最简单的可能是古老的WAV文件。
总的来说,做我想做的事情所需的步骤可能是这样的:
- 加载音频文件(使用WavFile类,如此答案所指定)
- 将自定义音频效果应用于一次充满文件的缓冲区
- 将充满已处理音频的缓冲区传递到声卡(使用类似于此示例的内容)
我从这里看到的唯一缺点(还没有测试过)可能是性能问题,因为使用纯Java可能有点慢。