Главная » Разработка для Android » Работа с несжатым звуком

0

Классы  AudioTrack и AudioRecord позволяют  напрямую  записывать аудио и воспроизводить аудиопоток в формате PCM, используя аппаратные возможности устройства.

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

Хотя подробное описание обработки несжатого аудио выходит за рамки этой книги, следующие разделы познакомят с ходом записи и воспроизве- дения «сырых» данных в формате PCM.

Запись звука с помощью AudioRecord

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

int bufferSize = AudioRecord.getMinBufferSize(frequency, channelConfiguration, audioEncoding);

AudioRecord audioRecord = new AudioRecord(MediaRecorder.AudioSource.MIC, frequency,

channelConfiguration,

audioEncoding, bufferSize);

Из соображений  конфиденциальности Android  требует, чтобы в мани- фесте вашего приложения значилось полномочие RECORD_AUDIO.

<uses-permission android:name="android.permission.RECORD_AUDIO"/>

Значения частоты, кодировщика аудио и настроек  каналов  повлияют на размер и качество записанного аудиофайла. Обратите  внимание, что ни один из этих параметров не связан с самими файлами.

Когда объект AudioRecord инициализирован, вызовите метод startRecording, чтобы начать асинхронную запись. Используйте метод read для добавления необработанных аудиоданных  в записываемый буфер:

audioRecord.startRecording();

while (isRecording) {

[ . . . заполнение буфера данными. . . ]

int bufferReadResult = audioRecord.read(buffer, 0, bufferSize);

}

В листинге 11.21 демонстрируется запись несжатого аудио с микрофона с последующим сохранением  в файл, размещенный на карте SD. Далее вы узнаете, как использовать AudioTrack,  чтобы воспроизвести записанное.

Листинг 11.21. Запись  необработанного  звука с помощью AudioRecord

int frequency = 11025;

int channelConfiguration = AudioFormat.CHANNEL_CONFIGURATION_MONO;

int audioEncoding = AudioFormat.ENCODING_PCM_16BIT;

Продолжение ?

Листинг 11.21 (продолжение)

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

// Создайте новый файл. try {

file.createNewFile();

} catch (IOException e) {}

try {

OutputStream os = new FileOutputStream(file); BufferedOutputStream bos = new BufferedOutputStream(os); DataOutputStream dos = new DataOutputStream(bos);

int bufferSize = AudioRecord.getMinBufferSize(frequency, channelConfiguration, audioEncoding);

short[] buffer = new short[bufferSize];

// Создайте новый объект AudioRecord, чтобы записать звук.

AudioRecord audioRecord = new AudioRecord(MediaRecorder.AudioSource.MIC, frequency, channelConfiguration, audioEncoding, bufferSize);

audioRecord.startRecording();

while (isRecording) {

int bufferReadResult = audioRecord.read(buffer, 0, bufferSize);

for (int i = 0; i < bufferReadResult; i++)

dos.writeShort(buffer[i]);

}

audioRecord.stop();

dos.close();

} catch (Throwable t) {}

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

По теме:

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