Потоковое аудио из сокета на Android с помощью AudioTrack - PullRequest
1 голос
/ 28 февраля 2011

Я пытаюсь воспроизвести поток PCM, используя класс AudioTrack.Это код:

AudioTrack audioTrack = new AudioTrack(AudioManager.STREAM_MUSIC, 44100, AudioFormat.CHANNEL_OUT_MONO, AudioFormat.ENCODING_PCM_16BIT, 20000, AudioTrack.MODE_STREAM);
audioTrack.play();
// Reading data.
byte[] data = new byte[200];
int n = 0;
try {
   while ((n = s.getInputStream().read(data)) != -1)
      audioTrack.write(data, 0, n);
}
catch (IOException e) {
   return;
}

К сожалению, звук, который я получаю, постоянно прерывается.Я попытался записать данные в файл вместо записи в audioTrack и воспроизведения с помощью aplay.Кажется, это идеально.Нет перерыва.Что-то не так в коде, который я сообщил при использовании audioTrack?Или просто данные не приходят вовремя?Спасибо!

Ответы [ 4 ]

3 голосов
/ 29 апреля 2011

Попробуйте поместить код в отдельный поток с высоким приоритетом.

android.os.Process.setThreadPriority(android.os.Process.THREAD_PRIORITY_URGENT_AUDIO)

В run () потока прочитайте и запишите данные.

2 голосов
/ 28 февраля 2011

Считывание аудиоданных из потока с переменной задержкой и отправка их в audioTrack.write в том же потоке будет плохо работать, как вы уже заметили.Это задание для двух потоков, где один читает данные из потока (и буферизует разумное количество), а другой записывает аудиоданные в объект audioTrack.Вы могли бы избежать чтения и записи больших блоков аудиоданных одновременно, но класс audioTrack налагает на это ограничения.Когда поток audioTrack просыпается после операции записи, вы не можете выполнять значительную работу в этом потоке, иначе у вас будут пропуски в аудиовыходе;Вы должны предоставить ему непрерывный поток данных.

2 голосов
/ 28 февраля 2011

Вы можете сделать несколько проверок:

  1. Используйте свой код для чтения файла.Просто откройте файл в виде потока.

  2. Измерьте пропускную способность.Каждый раз, когда приходит кусок данных, записывайте время (System. nanoTime()) и длину.Тогда вы можете рассчитать, если данные поступают поздно.

0 голосов
/ 28 февраля 2011

Я не использовал AudioTrack раньше, но сравнивая вашу версию с этой реализацией , я вижу главное отличие в том, что вы создаете AudioTrack с другим размером буфера, чем вы используете собственный буфер: 20000 против 200. Я бы попробовал использовать один и тот же размер для обоих.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...