我试图从MIC直接记录到一个短阵列。在Android中的字节数组中记录MIC声音
目标不是写一个带音轨的文件,只需将它保存在一个短阵列中即可。
如果试过了几种方法,我发现最好的方法是使用AudioRecord进行录音并使用AudioTrack进行播放。我已经找到了一个良好的班在这里:
Android: Need to record mic input
该类使所有我需要的,我只需要修改它来实现我想要的结果,但是...我不明白这一点很好,我“M失去了一些东西......
这里是我的修改(不工作):
private class Audio extends Thread {
private boolean stopped = false;
/**
* Give the thread high priority so that it's not canceled unexpectedly, and start it
*/
private Audio()
{
android.os.Process.setThreadPriority(android.os.Process.THREAD_PRIORITY_URGENT_AUDIO);
start();
}
@Override
public void run()
{
Log.i("Audio", "Running Audio Thread");
AudioRecord recorder = null;
AudioTrack track = null;
//short[][] buffers = new short[256][160];
int ix = 0;
/*
* Initialize buffer to hold continuously recorded audio data, start recording, and start
* playback.
*/
try
{
int N = AudioRecord.getMinBufferSize(8000,AudioFormat.CHANNEL_IN_MONO,AudioFormat.ENCODING_PCM_16BIT);
recorder = new AudioRecord(AudioSource.MIC, 8000, AudioFormat.CHANNEL_IN_MONO, AudioFormat.ENCODING_PCM_16BIT, N*10);
short[] buff = new short[N];
recorder.startRecording();
/*
* Loops until something outside of this thread stops it.
* Reads the data from the recorder and writes it to the audio track for playback.
*/
while(!stopped) {
//Log.i("Map", "Writing new data to buffer");
//short[] buffer = buffer[ix++ % buffer.length];
N = recorder.read(buff, 0, buff.length);
}
recorder.stop();
recorder.release();
track = new AudioTrack(AudioManager.STREAM_MUSIC, 8000,
AudioFormat.CHANNEL_OUT_MONO, AudioFormat.ENCODING_PCM_16BIT, N*10, AudioTrack.MODE_STREAM);
track.play();
for (int i =0; i< buff.length;i++) {
track.write(buff, i, buff.length);
}
} catch(Exception x) {
//Log.e("Audio", x.getMessage());
x.printStackTrace();
} finally {
track.stop();
track.release();
}
}
/**
* Called from outside of the thread in order to stop the recording/playback loop
*/
private void close()
{
stopped = true;
}
}
我需要的是记录在短期阵列缓存声音,当用户按下一个按钮,玩它......但现在,我试图记录声音,并且当用户按下按钮时,录音停止和声音开始播放...
任何人都可以帮助我吗?
谢谢。
你在'recorder.read()'函数调用中得到了什么吗? 'N'中返回多少个字节?你知道当你像这样读取缓冲区时,你会得到一小段音频吗?这就像20ms的数据,所以如果你试图通过听来验证你不会听到它。您的循环继续读入单个缓冲区,直到“停止”设置为true。所以你只会播放最后一段音频。 – spartygw 2013-05-14 15:30:21
N return(此刻我按下了停止按钮)4096.说实话,我并不真正理解这段代码,也许是因为我没有使用过多的输入流......感谢您的解释,现在我明白了为什么只听起来相同的时间...所以我怎么能做到这一点,以保存短阵列中的所有字节? – josecash 2013-05-14 16:07:36