首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在android中将MIC声音录制成字节数组

在android中将MIC声音录制成字节数组
EN

Stack Overflow用户
提问于 2013-05-14 22:39:57
回答 1查看 5.8K关注 0票数 0

我正试着从麦克风直接记录到一个短的数组。

我们的目标不是写一个带有音轨的文件,只是把它保存在一个短的数组中。

如果我已经尝试了几种方法,我找到的最好的方法是用AudioRecord录制,然后用AudioTrack播放。我在这里找到了一个很好的类:

Android: Need to record mic input

这个类做了我所需要的一切,我只需要修改它来实现我想要的结果,但是……我不太理解它,我遗漏了一些东西……

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

代码语言:javascript
复制
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;
        }

    }

我需要的是在短数组缓冲区中录制声音,当用户按下按钮,立即播放it...But时,我正在尝试录制声音,当用户按下按钮时,录制停止,声音开始播放...

有人能帮我吗?

谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-05-15 09:34:02

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

只是让你明白,根据记录时间的长短,这可能是大量的缓冲数据。您可以将其写入文件或将一系列缓冲区存储为某种抽象数据类型。

为了让一些东西正常工作,创建一个short []的vector,并在‘while(!loop )’循环中分配一个新的short []缓冲区,然后将其填充到Vector中。

在while循环停止之后,您可以遍历向量并将缓冲区写入AudioTrack。

正如你现在所理解的,你听到的点点只是最后20ms左右的音频,因为你的缓冲区只保留了最后一小部分。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16546149

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档