在Android中播放立体声

时间:2011-12-12 17:04:23

标签: android audio frequency

此问题上的类似主题仅包括左右频率相同的单声道演奏音色。

我的问题是:如何生成立体声音调,使左声道的频率与右声道不同?

我想过预录制.wav文件但记录了很多.wav文件并将它放在res文件夹上并不是一个好主意。

我遇到了SoundPoolAudioTrack课程,但我需要一个片段,显示在播放音调之前存储为缓冲区的左右声道的不同频率。

或者还有其他方法吗?请提供所需的摘要。

4 个答案:

答案 0 :(得分:4)

我从未尝试过这个:

  1. 初始化左右频率
    //playback rate (1.0 = normal playback, range 0.5 to 2.0)
    float lFrequency = 1.0;
    float rFrequency = 1.0;

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

  3. 加载曲目两次(load function
    int sLeft = sp.load(mContext, R.raw.yourAudioFileId, 1);
    int sRight = sp.load(mContext, R.raw.yourAudioFileId, 1);

  4. 使用不同的费率(play function)播放2个声音(一个在左边,一个在右边) sp.play (sLeft, 1.0, 0.0, 0, 0, lFrequency);
    sp.play (sRight, 0.0, 1.0, 0, 0, rFrequency);

答案 1 :(得分:3)

据我了解,如果您使用SoundPool,它将在立体声中播放,无需任何特殊配置。从文档:“SoundPool库使用MediaPlayer服务将音频解码为原始的16位PCM单声道或立体声流” 所以只要您播放的文件开始时是立体声,就应该这样播放。

答案 2 :(得分:1)

不是预先录制WAV文件并将它们嵌入到您的应用程序中,而是可以从代码中生成内存中的分离频道WAV音频,然后将其保存为您将使用SoundPool播放的WAV文件,或者播放音频直接使用AudioTrack(我推荐后者)。

音频本身只是一个(通常)2字节整数的数组。对于立体声,左和右样本在整个阵列中交错(因此样本[0]是第一个L样本,样本[1]是第一个R样本,样本[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

答案 3 :(得分:0)

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