在安卓系统中播放立体声音调

6
这个问题的类似主题只涉及在左右频率相同的情况下仅播放单声道。我的问题是:如何生成一个立体声音,使左通道的频率与右通道不同?我想到了预先录制.wav文件,但是记录许多.wav文件并将其放置在res文件夹中并不是一个好主意。我接触了SoundPool和AudioTrack类,但我需要一段显示左右声道的不同频率存储为缓冲区以在播放音调之前的代码片段。或者还有其他方法吗?请提供所需的代码片段。
4个回答

5

我从未尝试过这个:

  1. 初始化您的左右频率
    //播放速度(1.0 = 正常播放,范围为 0.5 到 2.0)
    float lFrequency = 1.0;
    float rFrequency = 1.0;

  2. 初始化SoundPool对象
    SoundPool sp = SoundPool(2, AudioManager.STREAM_MUSIC, 0);

  3. 加载您的轨道两次 (load函数)
    int sLeft = sp.load(mContext, R.raw.yourAudioFileId, 1);
    int sRight = sp.load(mContext, R.raw.yourAudioFileId, 1);

  4. 使用不同的速率播放两个声音(一个在左侧,一个在右侧)(play函数)
    sp.play (sLeft, 1.0, 0.0, 0, 0, lFrequency);
    sp.play (sRight, 0.0, 1.0, 0, 0, rFrequency);


在步骤4中,我认为左频率和右频率不会同时播放。我需要将左右频率一起播放。 - Neigyl R. Noval
@NeigylR.Noval 你试过了吗?只要我们使用2作为最大值构建SoundPool,两个声音就会一起播放。 - Sherif elKhatib

3
据我了解,如果您使用SoundPool,则无需进行任何特殊配置即可立即在立体声中播放。根据文档:“SoundPool库使用MediaPlayer服务将音频解码为原始的16位PCM单声道或立体声流”,只要您播放的文件本身就是立体声,它就应该以这种方式播放。请注意,HTML标记已保留。

1

与其预先录制WAV文件并将其嵌入应用程序中,您可以从代码中在内存中生成分离通道的WAV音频,然后将其保存为WAV文件并使用SoundPool播放,或者直接使用AudioTrack播放音频(我建议选择后者)。

音频本身只是一个(通常为)2字节整数的数组。对于立体声,左右样本交错分布在整个数组中(因此sample [0]是第一个L样本,sample [1]是第一个R样本,sample [2]是第二个L样本等)。因此,当您的应用程序启动时,您需要创建一个长度足够长的数组(对于CD质量的音频,每秒音频需要88200个元素),然后使用计算出的值填充样本以获取您的音调,然后将该数组传递给AudioTrack进行播放。

或者,您可以将音频保存为WAV文件,并使用SoundPool播放它(从内存占用的角度来看,这可能更好)。 WAV格式非常简单易懂(读取则更为复杂):只需具有各种属性的44字节标头,然后是音频数据本身。

我想我以前回答过类似的Android问题,所以我要去看看是否有一些基本的代码可以做到这一点。

不是我,但这里有一些很好的Java代码可以读写WAV文件:

http://computermusicblog.com/blog/2008/08/29/reading-and-writing-wav-files-in-java


0

我会使用其他软件生成一个.ogg立体声文件(不要使用WAV文件,它们太重了),这是一种非常轻量级的音频格式,在Android上运行良好。我使用免费的Reaper,Audacity更容易,任何人都可以。只需创建两个单声道音轨,将它们的平移设置为完全右和完全左。加载您的样本,并应用音高变化插件来改变其中一个音轨的频率。您也可以使用合成器生成它们。然后将所有内容渲染到tone.ogg文件中。 Tone


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