Я реализую приложение Android для обработки данных звука PCM (для длинных звуков, то есть музыкальных дорожек). Я решил использовать класс AudioTrack для воспроизведения музыки, но не может быть помещен в тот же поток, что и активность, потому что блокирует все приложение - и вот вопрос: следует ли использовать операции AudioTrack в отдельном потоке или в асинхронной задаче (или любой другой вариант)? Что было бы лучше всего? Мне нужно воспроизвести/приостановить/остановить и изменить музыкальные файлы.Лучший способ использования Androids Audiotrack
Теперь я пытаюсь управлять этим потоком java, и его почти нормально - игра в порядке, приостановка почти (его «падение» части звука), но когда я меняю музыкальный файл, предыдущий не останавливается, а theres - смешанный вывод (я думаю, что что-то не так с моей реализацией потока).
И - нет, я не могу использовать MediaPlayer в этом приложении (я хочу изменить данные PCM на лету).
Я искал некоторую помощь в google и здесь, в 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.
Благодарим вас за ответ! Но, к сожалению, эффект тот же. Я немного изменил свою реализацию, и теперь все работает отлично, за исключением загрузки следующего трека. Но я вернусь к этому вопросу в будущем. Спасибо! – Michal
Добро пожаловать. Пожалуйста, напишите свой ответ, который может быть полезен другим. –
Где ответ, пожалуйста? –