Я пытался заставить свое приложение записывать звук, исходящий из микрофона, и воспроизводить его в (приблизительно) режиме реального времени, но безуспешно.
Я использую классы AudioRecord и AudioTrack для записи и воспроизведения соответственно. Я пробовал разные подходы, я пытался записать входящий звук и записать его в файл, и он работал нормально. Я также пытался воспроизвести звук из этого файла ПОСЛЕ AudioTrack, и он тоже работал нормально. Проблема в том, что я пытаюсь воспроизвести звук в режиме реального времени вместо чтения файла после его записи.
Вот код:
//variables
private int audioSource = MediaRecorder.AudioSource.MIC;
private int samplingRate = 44100; /* in Hz*/
private int channelConfig = AudioFormat.CHANNEL_CONFIGURATION_MONO;
private int audioFormat = AudioFormat.ENCODING_PCM_16BIT;
private int bufferSize = AudioRecord.getMinBufferSize(samplingRate, channelConfig, audioFormat);
private int sampleNumBits = 16;
private int numChannels = 1;
// …
AudioRecord recorder = new AudioRecord(audioSource, samplingRate, channelConfig, audioFormat, bufferSize);
recorder.startRecording();
isRecording = true;
AudioTrack audioPlayer = new AudioTrack(AudioManager.STREAM_MUSIC, 44100, AudioFormat.CHANNEL_CONFIGURATION_MONO,
AudioFormat.ENCODING_PCM_16BIT, bufferSize, AudioTrack.MODE_STREAM);
if(audioPlayer.getPlayState() != AudioTrack.PLAYSTATE_PLAYING)
audioPlayer.play();
//capture data and record to file
int readBytes=0, writtenBytes=0;
do{
readBytes = recorder.read(data, 0, bufferSize);
if(AudioRecord.ERROR_INVALID_OPERATION != readBytes){
writtenBytes += audioPlayer.write(data, 0, readBytes);
}
}
while(isRecording);
Выдается исключение java.lang.IllegalStateException, причина которого вызвана "play (), вызванным для неинициализированной AudioTrack".
Однако, если я изменю инициализацию AudioTrack, например, чтобы использовать частоту дискретизации 8000 Гц и формат выборки 8 бит (вместо 16), это больше не выдает исключение, и приложение работает, хотя и производит ужасный шум.
При воспроизведении AudioTrack из файла не возникает проблем с инициализацией AudioTrack, я пробовал 44100 и 16 бит, и он работал правильно, создавая правильный звук.
Любая помощь?