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

如何在Android中使用音频api录制音频?,android,microphone,Android,Microphone,我有一部LG安卓手机,版本为2.3.3。我需要在耳机插孔中连接一个麦克风,因为我想创建一个可以读取声音样本的应用程序 如何以编程方式阅读示例 2) 如何以编程方式阅读示例 据我所知,在安卓系统中,您可以使用以下两类之一录制音频: 用于录制音频和视频。记录控制基于一个简单的状态机 AudioRecord类管理Java应用程序的音频资源,以便从平台的音频输入硬件录制音频。这是通过“拉”(读取)音频记录对象中的数据来实现的。应用程序负责使用以下三种方法之一及时轮询AudioRecord对象:读

我有一部LG安卓手机,版本为2.3.3。我需要在耳机插孔中连接一个麦克风,因为我想创建一个可以读取声音样本的应用程序

如何以编程方式阅读示例

2) 如何以编程方式阅读示例

据我所知,在安卓系统中,您可以使用以下两类之一录制音频:

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

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

Ps:按照上面的链接阅读并理解最适合您需要的内容


1) 你推荐哪种话筒

正如我在对您的问题的评论中所提到的,这是关于stackoverflow的,但为了完整起见:


如果您真的想阅读音频样本,我建议您使用AudioRecord而不是MediaRecorder,因为它可以让您更好地控制音频样本。。。为此,您可以使用以下代码,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,它可能对您有用,

您应该将此问题分为两个不同的问题。你应该问的第一部分!