Java → Запись звука с микрофона и его проигрывание с помощью J2ME MMAPI

В данной статье рассказывается, как с помощью MMAPI осуществить запись и воспроизведение звука в J2ME.
Запись звука с микрофона

Прежде всего, необходимо создать объект Player, который будет получать поток данных от микрофона.

Player player;
...
player=Manager.createPlayer(“capture://audio?encoding=amr”);
player.realize();

Здесь мы использовали строку вида capture://audio?encoding=amr, это простейший путь получить запись с эффектом Микки Мауса на телефоне Nokia 6600. Если Вы собираетесь использовать другое оборудование, попробуйте использовать capture://audio или другие кодировки:
audio_encodings = audio_enc_param ( "&" audio_param )
audio_enc_param = "encoding=" audio_enc
audio_enc = "pcm" / "ulaw" / "gsm" / content_type
audio_param = "rate=" rate /
"bits=" bits /
"channels=" channels /
"endian=" endian /
"signed=" signed /
"type=" audio_type
rate = "96000" / "48000" / "44100" /
"22050" / "16000" / "11025" /
"8000" / other_rate
other_rate = pos_integer
bits = "8" / "16" / "24" / other_bits
other_bits = pos_integer
channels = pos_integer
endian = "little" / "big"
signed = "signed" / "unsigned"
audio_type = bitrate_variable / other_type
other_type = alphanumeric
pos_integer = 1DIGIT

Напимер:

capture://audio?rate=8000&bits=16
capture://audio?encoding=pcm&signed=unsigned


Чтобы определить какие из параметров захвата звука поддерживаются Вашим телефоном, попробуйте выполнить следующий код. К сожалению, он работает не на всех телефонах.

String[] types= Manager.getSupportedContentTypes("capture");
for( int i= 0; i < types.length; i++ )
someStringItem.setText(errorItem.getText() + " "+types[i]);

Для начла записи необходимо создать объект RecordControl. Обязательно создайте поток ByteArayOutputStream, куда будет писать входящие данные.

RecordControl rc = (RecordControl)player.getControl("RecordControl");
ByteArrayOutputStream output = new ByteArrayOutputStream();
rc.setRecordStream(output);
rc.startRecord();
player.start();

После начала записи необходимо указать время, которое Вы собираетесь записать. Для остановки записи можете использовать любое событие, например нажатие не клавишу, или просто дождитесь окончания времени записи. В приведенном ниже примере производится пятисекундная запись звука, после чего rc.commit() останавливает ее.

Thread.currentThread().sleep(5000);
rc.commit();

Записанный звук можно легко сохранить в RMS. Если вы не собираетесь долго хранить эту запись, ее можно перенести в массив байт, а затем прослушать.

byte[] recordedSoundArray = output.toByteArray();
Воспроизведение записи

Приведенный ниже код воспроизводит сделанную запись:

ByteArrayInputStream recordedInputStream = new ByteArrayInputStream(recordedSoundArray);
Player p2 = Manager.createPlayer(recordedInputStream,"audio/x-wav");
p2.prefetch();
p2.start();
Заключение

Надо сказать, что рассмотренный метод будет работать только на устройствах, которые позволяют MMAPI осуществить захват входящего аудио или видео с оборудования телефона (с микрофона или камеры). К таким устройствам, например, относятся телефоны Nokia 6600 (Software version 4.09.1) и Siemens S65.
Добавил: javavirys ( 2017-02-13 00:37:54 )
Теги:J2ME Recording
Рейтинг: + 1 -
Просмотров: 2003

Специальные предложения