Главная » Разработка для Android » Воспроизведение звука с помощью AudioTrack

0

Используйте класс AudioTrack,  чтобы воспроизводить звук напрямую через аппаратные  буферы устройства. Создайте новый объект AudioTrack, указав  потоковый  режим, частоту, параметры  каналов,  тип кодировщика и длину аудио.

AudioTrack audioTrack = new AudioTrack(AudioManager.STREAM_MUSIC, frequency, channelConfiguration, audioEncoding,

audioLength, AudioTrack.MODE_STREAM);

Поскольку аудиоданные необработанные, отсутствует метаинформация, связанная с ними. Поэтому важно установить  корректные  свойства, чтобы они совпадали с теми, которые были использованы при записи файла.

Инициализировав объект AudioTrack, вызовите метод play, чтобы начать асинхронное  воспроизведение. Используйте метод write, чтобы добавить

«сырые» аудиоданные  в буфер проигрывателя.

audioTrack.play();

audioTrack.write(audio, 0, audioLength);

Вы можете начать запись в буфер объекта AudioTrack как до вызова метода play, так и после. В первом случае воспроизведение пойдет сразу после вызова, во втором — звук станет проигрываться, как только запишете данные в буфер AudioTrack.

В листинге 11.22 показано воспроизведение файла, записанного  ранее, при этом ожидаемая  частота аудиофайла удваивается, что приводит к уве- личению скорости проигрывания вдвое.

Листинг 11.22.

int frequency = 11025/2;

int channelConfiguration = AudioFormat.CHANNEL_CONFIGURATION_MONO;

int audioEncoding = AudioFormat.ENCODING_PCM_16BIT;

File file = new File(Environment.getExternalStorageDirectory(), "raw.pcm");

// Массив типа short для хранения аудиоданных (звук 16-битный,

// поэтому выделяем по 2 байта на значение) int audioLength = (int)(file.length()/2); short[] audio = new short[audioLength];

try {

InputStream is = new FileInputStream(file); BufferedInputStream bis = new BufferedInputStream(is); DataInputStream dis = new DataInputStream(bis);

int i = 0;

while (dis.available() > 0) { audio[audioLength] = dis.readShort(); i++;

}

// Закрытие входящих потоков. dis.close();

// Создание объекта AudioTrack и проигрывание звука с его помощью

AudioTrack audioTrack = new AudioTrack(AudioManager.STREAM_MUSIC, frequency, channelConfiguration, audioEncoding,

audioLength,

AudioTrack.MODE_STREAM);

audioTrack.play();

audioTrack.write(audio, 0, audioLength);

} catch (Throwable t) {}

Источник: Майер P. Android 2 : программирование приложений для планшетных компьютеров и смартфонов : [пер. с англ. ] / Рето Майер. — М. : Эксмо, 2011. — 672 с. — (Мировой компьютерный бестселлер).

По теме:

  • Комментарии