java Android:混合多个 AudioTrack 实例?
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/4425526/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Android: Mixing multiple AudioTrack instances?
提问by BTR
I need to run two instances of AudioTrack at the same time. They must run separately because I'm playing them at different, variable sample rates. I found that if I run them in the same thread, they "take turns". I'm running them each in their own thread, but the audio is stuttering.
我需要同时运行两个 AudioTrack 实例。它们必须单独运行,因为我以不同的可变采样率播放它们。我发现如果我在同一个线程中运行它们,它们会“轮流”。我在各自的线程中运行它们,但音频断断续续。
Any ideas on making two instances play nice? If not, any tips on mixing two short buffers into one, even if I want to play them at different sample rates.
关于让两个实例玩得开心的任何想法?如果没有,即使我想以不同的采样率播放它们,有关将两个短缓冲区混合为一个的任何提示。
回答by DeliveryNinja
I have 4 audioTracks playing at once and they seem to play fine. Testing on HTC Desire 1.1ghz OC. I get glitches with the threading sometimes though. Occasionally if all four are playing one will not stop when I try to join the thread. Need to do more testing. Here is my class for playing back a wav file recorded at a given path
我一次播放了 4 个音轨,它们似乎播放得很好。在 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;
}
}
}