在android中将麦克风声音录制到字节数组中

在android中将麦克风声音录制到字节数组中,android,audio-recording,bytebuffer,Android,Audio Recording,Bytebuffer,我试着从麦克风直接录制到短阵列 我们的目标不是编写带有音轨的文件,而是将其保存在一个短数组中 如果我试过几种方法,我发现最好的方法就是用录音带录音,然后用音轨播放。我在这里找到了一门好课: 这门课做了我所需要的一切,我只需要修改它来达到我想要的结果,但是…我没有很好地理解它,我错过了一些东西 这是我的修改(根本不起作用): 私有类音频扩展线程{ 私有布尔停止=false; /** *为线程赋予高优先级,使其不会意外取消,然后启动它 */ 私人音频() { android.os.Process

我试着从麦克风直接录制到短阵列

我们的目标不是编写带有音轨的文件,而是将其保存在一个短数组中

如果我试过几种方法,我发现最好的方法就是用录音带录音,然后用音轨播放。我在这里找到了一门好课:

这门课做了我所需要的一切,我只需要修改它来达到我想要的结果,但是…我没有很好地理解它,我错过了一些东西

这是我的修改(根本不起作用):

私有类音频扩展线程{
私有布尔停止=false;
/**
*为线程赋予高优先级,使其不会意外取消,然后启动它
*/
私人音频()
{ 
android.os.Process.setThreadPriority(android.os.Process.THREAD\u PRIORITY\u emergency\u AUDIO);
start();
}
@凌驾
公开募捐
{ 
Log.i(“音频”,“运行音频线程”);
录音机=空;
AudioTrack track=null;
//short[][]缓冲区=新的short[256][160];
int ix=0;
/*
*初始化缓冲区以保存连续录制的音频数据、开始录制和启动
*播放。
*/
尝试
{
int N=AudioRecord.getMinBufferSize(8000,AudioFormat.CHANNEL,单声道,AudioFormat.ENCODING,PCM,16位);
记录器=新的音频记录(AudioSource.MIC,8000,AudioFormat.CHANNEL,单声道,AudioFormat.ENCODING,PCM,16位,N*10);
short[]buff=新的short[N];
记录器。开始记录();
/*
*循环,直到线程外的某个对象停止它。
*从录音机读取数据并将其写入音频曲目进行播放。
*/
当(!停止){
//Log.i(“映射”,“将新数据写入缓冲区”);
//short[]buffer=buffer[ix++%buffer.length];
N=记录器读数(增益,0,增益长度);
}
录音机。停止();
记录器。释放();
曲目=新的音频曲目(AudioManager.STREAM_MUSIC,8000,
AudioFormat.CHANNEL\u OUT\u MONO、AudioFormat.ENCODING\u PCM\u 16位、N*10、AudioTrack.MODE\u STREAM);
track.play();
for(int i=0;i
我需要的是在短数组缓冲区中录制声音,当用户按下一个按钮时播放…但现在,我正在尝试录制声音,当用户按下一个按钮时,录制停止,声音开始播放

有人能帮我吗


谢谢

您需要重新构造代码以执行您希望它执行的操作。如果我理解正确,您希望读取声音直到“stopped”设置为true,然后播放数据

您应该知道,根据记录时间的长短,可能会有大量缓冲数据。您可以将其写入文件或将一系列缓冲区存储到某种抽象数据类型中

只是为了让某些东西工作,创建一个short[]向量,并在“while(!stopped)”循环中分配一个新的short[]缓冲区,然后将其填充到向量中

在while循环停止后,您可以迭代向量并将缓冲区写入AudioTrack


正如您现在所了解的,您听到的光点只是最后20毫秒左右的音频,因为您的缓冲区只保留了最后一点点。

您在“recorder.read()”函数调用中得到了什么吗?“N”中返回了多少字节?你知道吗,当你像这样读取缓冲区时,你得到的是一个非常小的音频片段?这就像20毫秒的数据,所以如果你试图通过听来验证,你将听不到。循环将继续读取单个缓冲区,直到“stopped”设置为true。因此,您将只播放最后一段audio.N return(在我按下停止按钮的那一刻)4096。老实说,我真的不理解这段代码,可能是因为我没有太多地使用输入流…谢谢你的解释,现在我明白了为什么很多次都是同一个bip…那么我该如何在短数组中保存所有字节呢?
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;
        }

    }