我正在实现一个 Android 应用程序来处理 PCM 声音数据(对于长声音,即音乐曲目)。我决定使用 AudioTrack 类来播放音乐,但它不能与 Activity 放在同一个线程中,因为它会阻塞整个应用程序 - 这是问题 - 我应该将 AudioTrack 操作放在单独的线程中还是在异步任务(或任何其他选项)中?最好的方法是什么?我需要播放/暂停/停止和更改音乐文件。
现在我试图通过一个java线程来管理它,它几乎没问题 - 播放没问题,几乎暂停(它“丢弃”了一部分声音),但是当我更改音乐文件时,前一个不是停止并出现混合输出(我认为我的线程实现有问题)。
而且 - 不,我不能在这个应用程序中使用 MediaPlayer(我想即时修改 PCM 数据)。
我在谷歌和stackoverflow上寻找一些帮助,但没有任何帮助。
这是我目前的实现,如果有人想看看。
public class AudioPlayerManager {
private AudioTrack track;
private Thread thread;
private AudioTrackThread trackThread = new AudioTrackThread();
public int getPlayState() {
return track.getPlayState();
}
public int getAudioSession() {
return track.getAudioSessionId();
}
class AudioTrackThread implements Runnable {
private String filePath = "/music/wav/musicfile.wav";
@Override
public void run() {
try {
playWaveFile();
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
public void playWaveFile() throws FileNotFoundException {
int minSize = AudioTrack.getMinBufferSize(44100,
AudioFormat.CHANNEL_OUT_STEREO,
AudioFormat.ENCODING_PCM_16BIT);
track = new AudioTrack(AudioManager.STREAM_MUSIC, 44100,
AudioFormat.CHANNEL_OUT_STEREO,
AudioFormat.ENCODING_PCM_16BIT, minSize,
AudioTrack.MODE_STREAM);
File file = new File(FileListingUtils.getExternalStorageRootFile(),
filePath);
InputStream is = new FileInputStream(file);
byte[] music = new byte[512];
track.play();
try {
handleSound(is, music);
} catch (IOException e) {
e.printStackTrace();
}
track.stop();
track.release();
}
private void handleSound(InputStream is, byte[] music)
throws IOException {
int i;
while ((i = is.read(music)) != -1) {
track.write(music, 0, i);
}
}
}
public void playNew() {
if (track != null) {
track.stop();
//track.flush();
track.release();
}
thread = new Thread(trackThread);
thread.start();
}
public void playOrResume() {
this.track.play();
}
public void pause() {
this.track.pause();
}
}
感谢您的每一个帮助!
M。