Класс AudioRecord позволит вам записывать в буфер. Затем вы можете выбрать обработку буфера или сохранить его на SD-карту, в зависимости от ваших потребностей. То, что вы хотите сделать, полностью зависит от вашего приложения. Нужны ли вам данные после их обработки? Или вам нужен только обработанный результат? Вы собираетесь воспроизводить записи?
Ниже приведен упрощенный пример использования класса AudioRecord:
AudioRecord recorder = new AudioRecord(MediaRecorder.AudioSource.MIC,
sampleRate, AudioFormat.CHANNEL_IN_STEREO,
AudioFormat.ENCODING_PCM_16BIT, bufferSize);
recorder.startRecording();
short buf[] = new short[buffersize];
int n = 0;
while(<some condition>) {
n = recorder.read(buf, 0, bufferSize);
process(buf);
}
recorder.stop();
recorder.release();
Вы, очевидно, захотите поместить приведенный выше код в поток за пределами основного потока пользовательского интерфейса.
Вы должны убедиться, что все, что вы делаете в процессе, происходит достаточно быстро, чтобы вы могли вернуться к чтению данных до того, как буфер заполнится, иначе вы потеряете данные. Частота дискретизации и размер буфера будут зависеть от того, как вы обрабатываете данные и каковы ваши требования к задержке.
После того, как вы все это заработаете, вы можете решить, что хотите перевести телефон в «громкую связь», чтобы получить лучшее усиление через микрофон:
AudioManager amAudioManager;
amAudioManager = (AudioManager)getSystemService(Context.AUDIO_SERVICE);
amAudioManager.setMode(AudioManager.MODE_IN_CALL);
amAudioManager.setSpeakerphoneOn(true);
Да, вы должны перевести телефон в состояние IN_CALL, чтобы включить громкую связь. Да, некоторые телефоны видимо отключают возможность записи при IN_CALL.
person
mjr
schedule
27.06.2011