簡體   English   中英

如何在Android中使用音頻api錄制音頻?

[英]How to record audio using audio api in Android?

我有一個版本為2.3.3的LG Android手機。 我需要連接耳機插孔中的麥克風,因為我想創建一個讀取聲音樣本的應用程序。

如何以編程方式讀取樣本?

如果您真的想閱讀AudioSamples,我建議您使用AudioRecord而不是MediaRecorder,因為它可以讓您更好地控制AudioSamples ...為此您可以使用以下代碼,AudioCapturer是我的包裝類,我用它來獲取樣本AudioRecord object..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;
    }

}

現在你可以在你的程序的Main類中使用這個類的對象,它將開始為你提供音頻樣本,你可以在你的IAudioReceiver(使用這些樣本的類)中處理它們。

如果您仍想使用MediaRecorder, 此鏈接對您有用,

2)我如何以編程方式閱讀樣本?

據我所知,在Android中你可以使用以下兩個類之一錄制音頻:

  • MediaRecorder類

    用於錄制音頻和視頻。 錄制控制基於簡單的狀態機

  • AudioRecord類

    AudioRecord類管理Java應用程序的音頻資源,以記錄來自平台的音頻輸入硬件的音頻。 這是通過從AudioRecord對象“拉”(讀取)數據來實現的。 應用程序負責使用以下三種方法之一及時輪詢AudioRecord對象:read(byte [],int,int),read(short [],int,int)或read(ByteBuffer,int)。 選擇使用哪種方法將基於對AudioRecord用戶最方便的音頻數據存儲格式。

Ps:按照上面的鏈接閱讀並理解最符合您需求的鏈接。


1)你推薦哪款麥克風?

正如我在你的問題上的評論中所提到的,這在stackoverflow上的主題 ,但為了完整性的目的:

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM