2013-05-14 25 views
0

我试图从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; 
     } 

    } 

我需要的是记录在短期阵列缓存声音,当用户按下一个按钮,玩它......但现在,我试图记录声音,并且当用户按下按钮时,录音停止和声音开始播放...

任何人都可以帮助我吗?

谢谢。

+0

你在'recorder.read()'函数调用中得到了什么吗? 'N'中返回多少个字节?你知道当你像这样读取缓冲区时,你会得到一小段音频吗?这就像20ms的数据,所以如果你试图通过听来验证你不会听到它。您的循环继续读入单个缓冲区,直到“停止”设置为true。所以你只会播放最后一段音频。 – spartygw 2013-05-14 15:30:21

+0

N return(此刻我按下了停止按钮)4096.说实话,我并不真正理解这段代码,也许是因为我没有使用过多的输入流......感谢您的解释,现在我明白了为什么只听起来相同的时间...所以我怎么能做到这一点,以保存短阵列中的所有字节? – josecash 2013-05-14 16:07:36

回答

0

您需要重构代码以完成您想要的操作。如果我理解正确,您需要阅读声音,直到“停止”设置为true,然后播放数据。

只要你明白这可能是很多缓冲数据,具体取决于录制时间有多长。您可以将其写入文件或将一系列缓冲区存储为某种抽象数据类型。

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

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

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