使用AudioTrack在Android中播放wav文件:嘈杂的声音

时间:2014-06-15 13:36:23

标签: android audio

要在Android上制作声音,我使用AudioTrack

我已经能够产生正弦波,锯齿波,方波,但是拥有更逼真的声音会更好。

我发现.wav文件最容易在AudioTrack上播放,因为它们基本上只是带有标题的字节序列。

所以我在res/raw文件夹中有我的wav文件,我尝试使用此代码播放它:

public void writeWav(){
  byte[] byteData = null;
  InputStream is = getResources().openRawResource(R.raw.high);
  byteData = new byte[mBufferSize];
  try {
    is.read(byteData);
    is.close();
  }
  catch (FileNotFoundException e) {}
  catch (IOException e) {}

  mAudioTrack.write(byteData, 0, byteData.length);
}

但我得到的只是噪音。我发现有很多关于AudioTrack和wav文件的问题,但我无法找到我的噪音问题的答案。

1 个答案:

答案 0 :(得分:2)

使用此方法使用audioTrack播放声音。它对我有用

public void playAudioTrack() {

    int sampleFreq = 16000;
    File file = new File("--filePath--");

    int shortSizeInBytes = Short.SIZE / Byte.SIZE;

    int minBufferSize = AudioTrack.getMinBufferSize(sampleFreq, AudioFormat.CHANNEL_OUT_MONO,
            AudioFormat.ENCODING_PCM_16BIT);

    int bufferSizeInBytes = (int)(file.length() / shortSizeInBytes);

    final AudioTrack at = new AudioTrack(AudioManager.STREAM_MUSIC, sampleFreq,
            AudioFormat.CHANNEL_OUT_MONO, AudioFormat.ENCODING_PCM_16BIT, minBufferSize,
            AudioTrack.MODE_STREAM);
    int i = 0;
    byte[] s = new byte[bufferSizeInBytes];

    try {
        final FileInputStream fin = new FileInputStream("--filePath--");
        final DataInputStream dis = new DataInputStream(fin);
        at.setNotificationMarkerPosition((int)(file.length() / 2));

        at.play();
        while ((i = dis.read(s, 0, bufferSizeInBytes)) > -1) {
            at.write(s, 0, i);

        }

    } catch (FileNotFoundException e) {

    } catch (IOException e) {

    } catch (Exception e) {

    }

}