【发布时间】:2011-08-09 08:45:23
【问题描述】:
我一直试图让我的应用程序记录来自麦克风的声音并(大约)实时回放,但没有成功。
我分别使用 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 的原因是“在未初始化的 AudioTrack 上调用 play()”。
但是,如果我更改 AudioTrack 初始化,例如使用 8000Hz 采样率和 8 位采样格式(而不是 16 位),它不会再抛出异常并且应用程序会运行,尽管它会产生可怕的噪音。
当我从文件播放 AudioTrack 时,AudioTrack 的初始化没有问题,我尝试了 44100 和 16 位,它工作正常,产生了正确的声音。
有什么帮助吗?
【问题讨论】:
标签: android audio real-time record audio-recording