需要一个简单的录音示例

Posted

技术标签:

【中文标题】需要一个简单的录音示例【英文标题】:Need a simple example for audio recording 【发布时间】:2011-09-03 06:47:07 【问题描述】:

我需要在 android 中使用 AudioRecorder 进行简单的音频录制和播放示例。我用 MediaRecorder 试过了,效果很好。

【问题讨论】:

【参考方案1】:

你是说AudioRecord?搜索例如“AudioRecord.OnRecordPositionUpdateListener”使用 Google 代码搜索。顺便说一句,AudioRecord 录制,而不是播放。

另见:

Improve Android Audio Recording quality? Android AudioRecord class - process live mic audio quickly, set up callback function

【讨论】:

【参考方案2】:

这是录音的示例代码。

    private Runnable recordRunnable = new Runnable() 

    @Override
    public void run() 

        byte[] audiodata = new byte[mBufferSizeInBytes];
        int readsize = 0;

        Log.d(TAG, "start to record");
        // start the audio recording
        try 
            mAudioRecord.startRecording();
         catch (IllegalStateException ex) 
            ex.printStackTrace();
        

        // in the loop to read data from audio and save it to file.
        while (mInRecording == true) 
            readsize = mAudioRecord.read(audiodata, 0, mBufferSizeInBytes);
            if (AudioRecord.ERROR_INVALID_OPERATION != readsize
                    && mFos != null) 
                try 
                    mFos.write(audiodata);
                 catch (IOException e) 
                    e.printStackTrace();
                
            
        

        // stop recording
        try 
            mAudioRecord.stop();
         catch (IllegalStateException ex) 
            ex.printStackTrace();
        

        getActivity().runOnUiThread(new Runnable() 

            @Override
            public void run() 
                mRecordLogTextView.append("\n Audio finishes recording");
            
        );

        // close the file
        try 
            if (mFos != null)
                mFos.close();
         catch (IOException e) 
            e.printStackTrace();
        

    
;

那么你需要两个按钮(或者一个在不同的时间充当不同的功能)来启动和停止记录线程。

        mRecordStartButton = (Button) rootView
            .findViewById(R.id.audio_record_start);

    mRecordStartButton.setOnClickListener(new OnClickListener() 

        @Override
        public void onClick(View v) 

            // initialize the audio source
            int recordChannel = getChoosedSampleChannelForRecord();
            int recordFrequency = getChoosedSampleFrequencyForRecord();
            int recordBits = getChoosedSampleBitsForRecord();

            Log.d(TAG, "recordBits = " + recordBits);

            mRecordChannel = getChoosedSampleChannelForSave();
            mRecordBits = getChoosedSampleBitsForSave();
            mRecordFrequency = recordFrequency;

            // set up the audio source : get the buffer size for audio
            // record.
            int minBufferSizeInBytes = AudioRecord.getMinBufferSize(
                    recordFrequency, recordChannel, recordBits);

            if(AudioRecord.ERROR_BAD_VALUE == minBufferSizeInBytes)

                mRecordLogTextView.setText("Configuration Error");
                return;
            

            int bufferSizeInBytes = minBufferSizeInBytes * 4;

            // create AudioRecord object
            mAudioRecord = new AudioRecord(MediaRecorder.Audiosource.MIC,
                    recordFrequency, recordChannel, recordBits,
                    bufferSizeInBytes);

            // calculate the buffer size used in the file operation.
            mBufferSizeInBytes = minBufferSizeInBytes * 2;

            // reset the save file setup
            String rawFilePath = WaveFileWrapper
                    .getRawFilePath(RAW_PCM_FILE_NAME);

            try 
                File file = new File(rawFilePath);
                if (file.exists()) 
                    file.delete();
                

                mFos = new FileOutputStream(file);

             catch (Exception e) 
                e.printStackTrace();
            

            if (mInRecording == false) 

                mRecordThread = new Thread(recordRunnable);
                mRecordThread.setName("Demo.AudioRecord");
                mRecordThread.start();

                mRecordLogTextView.setText(" Audio starts recording");

                mInRecording = true;

                // enable the stop button
                mRecordStopButton.setEnabled(true);

                // disable the start button
                mRecordStartButton.setEnabled(false);
            

            // show the log info
            String audioInfo = " Audio Information : \n"
                    + " sample rate = " + mRecordFrequency + "\n"
                    + " channel = " + mRecordChannel + "\n"
                    + " sample byte = " + mRecordBits;
            mRecordLogTextView.setText(audioInfo);

        
    );

    mRecordStopButton = (Button) rootView
            .findViewById(R.id.audio_record_stop);
    mRecordStopButton.setOnClickListener(new OnClickListener() 

        @Override
        public void onClick(View v) 

            if (mInRecording == false) 

                Log.d(TAG, "current NOT in Record");

             else 

                // stop recording
                if (mRecordThread != null) 

                    Log.d(TAG, "mRecordThread is not null");

                    mInRecording = false;

                    Log.d(TAG, "set mInRecording to false");

                    try 
                        mRecordThread.join(TIMEOUT_FOR_RECORD_THREAD_JOIN);
                        Log.d(TAG, "record thread joins here");
                     catch (InterruptedException e) 
                        e.printStackTrace();
                    

                    mRecordThread = null;

                    // re-enable the start button
                    mRecordStartButton.setEnabled(true);

                    // disable the start button
                    mRecordStopButton.setEnabled(false);

                 else 
                    Log.d(TAG, "mRecordThread is null");
                
            
        
    );

然后您可以将 pcm 数据保存到 WAV 文件中。

【讨论】:

以上是关于需要一个简单的录音示例的主要内容,如果未能解决你的问题,请参考以下文章

急!!!!如何通过python制作一个简单的录音机,录制自己的声音采用8k采样,16位量化编码,观察其数值?

录音在线转文字方法

从零开始实现基于微信JS-SDK的录音与语音评价功能

JavaScript 实现页面中录音功能

录音音频怎么转换成文字?用这几个方法轻松解决,超级简单

通过Android录音进行简单音频分析