如何在Android中使用audio api录制音频?

问题描述:

我有一个LG电话与版本2.3.3。我需要在耳机插孔中连接麦克风,因为我想创建一个读取声音样本的应用程序。如何在Android中使用audio api录制音频?

如何以编程方式读取示例?

+0

你应该分裂这个问题分成两个不同的人。你应该在[android.stackexchange.com](http://android.stackexchange.com/)中询问的第一部分! – Zuul 2012-07-11 21:30:37

2)如何以编程方式读取样本?

,我知道,在Android中您可以使用此两类之一录制声音:

  • MediaRecorder Class

    用于录制音频和视频。记录控制是基于一个简单的状态机

  • AudioRecord class

    的AudioRecord类管理Java应用程序的音频资源记录从平台的音频输入硬件音频上。这是通过“拉动”(读取)来自AudioRecord对象的数据来实现的。应用程序负责使用以下三种方法之一及时轮询AudioRecord对象:read(byte [],int,int),read(short [],int,int)或read(ByteBuffer,int)。选择使用哪种方法将基于AudioRecord用户最方便的音频数据存储格式。

PS:按照上面这个链接来阅读和理解最适合您的需求的。


1)你推荐哪麦克风?

正如我在放在你的问题的评论中提到,这个在这里得到off-topic上计算器,但出于完整性的目的:

如果你确实想读取AudioSamples,我会建议指示您使用AudioRecord而不是MediaRecorder,因为它可以让您更好地控制AudioSamples ...为了您可以使用以下代码,AudioCapturer是我用于从AudioRecord对象获取样本的包装类.IAudioReceiver是一个接口,它具有处理音频数据的方法。

public class AudioCapturer implements Runnable { 

    private AudioRecord audioRecorder = null; 
    private int bufferSize; 
    private int samplePerSec = 16000; 
    private String LOG_TAG = "AudioCapturer"; 
    private Thread thread = null; 

    private boolean isRecording; 
    private static AudioCapturer audioCapturer; 

    private IAudioReceiver iAudioReceiver; 

    private AudioCapturer(IAudioReceiver audioReceiver) { 
     this.iAudioReceiver = audioReceiver; 
    } 

    public static AudioCapturer getInstance(IAudioReceiver audioReceiver) { 
     if (audioCapturer == null) { 
      audioCapturer = new AudioCapturer(audioReceiver); 
     } 
     return audioCapturer; 
    } 

    public void start() { 

     bufferSize = AudioRecord.getMinBufferSize(samplePerSec, AudioFormat.CHANNEL_IN_MONO, AudioFormat.ENCODING_PCM_16BIT); 

     if (bufferSize != AudioRecord.ERROR_BAD_VALUE && bufferSize != AudioRecord.ERROR) { 

      audioRecorder = new AudioRecord(MediaRecorder.AudioSource.DEFAULT, this.samplePerSec, AudioFormat.CHANNEL_IN_MONO, 
        AudioFormat.ENCODING_PCM_16BIT, this.bufferSize * 10); // bufferSize 
                      // 10x 

      if (audioRecorder != null && audioRecorder.getState() == AudioRecord.STATE_INITIALIZED) { 
       Log.i(LOG_TAG, "Audio Recorder created"); 


       audioRecorder.startRecording(); 
       isRecording = true; 
       thread = new Thread(this); 
       thread.start(); 

      } else { 
       Log.e(LOG_TAG, "Unable to create AudioRecord instance"); 
      } 

     } else { 
      Log.e(LOG_TAG, "Unable to get minimum buffer size"); 
     } 
    } 

    public void stop() { 
     isRecording = false; 
     if (audioRecorder != null) { 
      if (audioRecorder.getRecordingState() == AudioRecord.RECORDSTATE_RECORDING) { 
       // System.out 
       // .println("Stopping the recorder inside AudioRecorder"); 
       audioRecorder.stop(); 
      } 
      if (audioRecorder.getState() == AudioRecord.STATE_INITIALIZED) { 
       audioRecorder.release(); 
      } 
     } 
    } 

    public boolean isRecording() { 
     return (audioRecorder != null) ? (audioRecorder.getRecordingState() == AudioRecord.RECORDSTATE_RECORDING) : false; 
    } 

    @Override 
    public void run() { 
     android.os.Process.setThreadPriority(android.os.Process.THREAD_PRIORITY_URGENT_AUDIO); 
     while (isRecording && audioRecorder.getRecordingState() == AudioRecord.RECORDSTATE_RECORDING) { 
      short[] tempBuf = new short[Constants.FRAME_SIZE/2]; 
      audioRecorder.read(tempBuf, 0, tempBuf.length);  
      iAudioReceiver.capturedAudioReceived(tempBuf, false); 
     } 
    } 

    /* 
    * (non-Javadoc) 
    * 
    * @see java.lang.Object#finalize() 
    */ 
    @Override 
    protected void finalize() throws Throwable { 
     super.finalize(); 
     System.out.println("AudioCapturer finalizer"); 
     if (audioRecorder != null && audioRecorder.getState() == AudioRecord.STATE_INITIALIZED) { 
      audioRecorder.stop(); 
      audioRecorder.release(); 
     } 
     audioRecorder = null; 
      iAudioReceiver = null; 
     thread = null; 
    } 

} 

现在你可以从主类,你计划使用这个类的对象,它会开始给你的音频采样你能处理他们的IAudioReceiver(类使用这些样本)内..

如果你还是想用MediaRecorder,this link能对你有用,