Android:混合多个AudioTrack实例?

BTR*_*BTR 8 java android sample mixer rate

我需要同时运行两个AudioTrack实例.它们必须单独运行,因为我以不同的可变采样率播放它们.我发现如果我在同一个线程中运行它们,它们会"轮流".我在他们自己的线程中运行它们,但音频是口吃.

关于制作两个实例的任何想法都很好吗?如果没有,任何关于将两个短缓冲混合成一个的提示,即使我想以不同的采样率播放它们.

Del*_*nja 11

我有4个audioTracks同时播放,他们似乎玩得很好.在HTC Desire 1.1ghz OC上进行测试.我有时会遇到线程故障.偶尔如果所有四个人都在玩,那么当我尝试加入这个帖子时就不会停止.需要做更多的测试.这是我的类,用于播放在给定路径上录制的wav文件

    package com.ron.audio.functions;

import java.io.BufferedInputStream;
import java.io.DataInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;

import android.media.AudioFormat;
import android.media.AudioManager;
import android.media.AudioTrack;

public class AudioPlayManager implements Runnable {

private File fileName;
private volatile boolean playing;

public AudioPlayManager() {
    super();
    setPlaying(false);
}

public void run(){
      // Get the length of the audio stored in the file (16 bit so 2 bytes per short)
      // and create a short array to store the recorded audio.
      int musicLength = (int)(fileName.length()/2);
      short[] music = new short[musicLength];

      try {
        // Create a DataInputStream to read the audio data back from the saved file.
        InputStream is = new FileInputStream(fileName);
        BufferedInputStream bis = new BufferedInputStream(is);
        DataInputStream dis = new DataInputStream(bis);

        // Read the file into the music array.
        int i = 0;
        while (dis.available() > 0) {
          music[i] = dis.readShort();
          i++;
        }

        // Close the input streams.
        dis.close();     

        // Create a new AudioTrack object using the same parameters as the AudioRecord
        // object used to create the file.
        AudioTrack audioTrack = new AudioTrack(AudioManager.STREAM_MUSIC, 
                                                11025, 
                                               AudioFormat.CHANNEL_CONFIGURATION_MONO,
                                               AudioFormat.ENCODING_PCM_16BIT, 
                                               musicLength, 
                                               AudioTrack.MODE_STREAM);
        // Start playback
        audioTrack.play();

        // Write the music buffer to the AudioTrack object
        while(playing){
            audioTrack.write(music, 0, musicLength);
        }

      }
      catch(Exception e){
          e.printStackTrace();
      }

}


public void setFileName(File fileName) {
    this.fileName = fileName;
}

public File getFileName() {
    return fileName;
}

public void setPlaying(boolean playing) {
    this.playing = playing;
}

public boolean isPlaying() {
    return playing;
}
Run Code Online (Sandbox Code Playgroud)

}

  • 还有一点比这更多,但真正的关键是在线程内创建AudioTrack.我有一个单独的"设备"类,所以我可以控制它的速度,音量等.将它组合到读取文件的类中,并在一个线程中完成所有操作,使它们发挥得很好.我现在在我的擎天柱(600mHz)上播放曲目.:) (2认同)