如何在android中连续录制背景音频/语音?

时间:2012-04-05 09:13:32

标签: android

由于我想在后台录制音频,我使用的是服务。但是我无法录制音频。

我在Activity中尝试了相同的代码,它对我有用。但是当输入语音/语音时如何在后台进行录音,这意味着如果有语音输入应该开始录音,那应该是在后台......?

2 个答案:

答案 0 :(得分:21)

在我的一个项目中,我有这个要求从麦克风连续录制音频。我无法共享该项目,但我可以共享特定的AudioRecorder类。

import java.io.File;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.nio.ByteBuffer;
import java.nio.ByteOrder;

import android.content.Context;
import android.media.AudioFormat;
import android.media.AudioRecord;
import android.media.MediaRecorder;
import android.util.Log;

public class AudioRecorder
{
public enum State {INITIALIZING, READY, RECORDING, ERROR, STOPPED};

private byte[] audioBuffer = null;

private int source = MediaRecorder.AudioSource.MIC;

private int sampleRate = 0;

private int encoder =0;

private int nChannels = 0;

private int bufferRead = 0;  

private int bufferSize = 0;

private RandomAccessFile tempAudioFile = null;

public AudioRecord audioRecorder = null;

private State state;

private short bSamples = 16;

private int framePeriod;

// The interval in which the recorded samples are output to the file
// Used only in uncompressed mode
private static final int TIMER_INTERVAL = 120;

volatile Thread t = null;

public int TimeStamp =0, count=0, preTimeStamp =0;





public AudioRecorder(Context c) 
{
    this.sampleRate = 11025;

    this.encoder =  AudioFormat.ENCODING_PCM_16BIT;

    this.nChannels = AudioFormat.CHANNEL_CONFIGURATION_MONO;

    this.preTimeStamp = (int) System.currentTimeMillis();

    myApp = (MyApp)c.getApplicationContext();

    mQueue = myApp.getQueue();

    try
    {
/*          
      String fileName = "/sdcard/XYZ/11025.wav";

        tempAudioFile = new RandomAccessFile(fileName,"rw");
*/      
        framePeriod = sampleRate * TIMER_INTERVAL / 1000;

        bufferSize = framePeriod * 2 * bSamples * nChannels / 8;

        if (bufferSize < AudioRecord.getMinBufferSize(sampleRate, nChannels, encoder))
        { 
            bufferSize = AudioRecord.getMinBufferSize(sampleRate, nChannels, encoder);

            // Set frame period and timer interval accordingly
            framePeriod = bufferSize / ( 2 * bSamples * nChannels / 8 );

            Log.w(AudioRecorder.class.getName(), "Increasing buffer size to " + Integer.toString(bufferSize));
        }

        audioRecorder = new AudioRecord(source,sampleRate,nChannels,encoder,bufferSize);

        audioBuffer = new byte[2048];

        audioRecorder.setRecordPositionUpdateListener(updateListener);

        audioRecorder.setPositionNotificationPeriod(framePeriod);




    }
    catch(Exception ex)
    {
        ex.printStackTrace();
    }
}

private AudioRecord.OnRecordPositionUpdateListener updateListener = new AudioRecord.OnRecordPositionUpdateListener()
{

    @Override
    public void onPeriodicNotification(AudioRecord recorder)
    {
//          Log.d(Constant.APP_LOG,"Into Periodic Notification...");



        } 
        catch (IOException e)
        {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        */

    }


    @Override
    public void onMarkerReached(AudioRecord recorder) {
        // TODO Auto-generated method stub

    }

};

public void start()
{

    if (state == State.INITIALIZING)
    {

        audioRecorder.startRecording();

        state = State.RECORDING;



            t = new Thread()
            {
                public void run()
                {
                    //Here You can read your Audio Buffers
                   audioRecorder.read(audioBuffer, 0, 2048);
                }
            };

            t.setPriority(Thread.MAX_PRIORITY);

            t.start();




    }
    else
    {
        Log.e(AudioRecorder.class.getName(), "start() called on illegal state");

        state = State.ERROR;
    }

}

public void stop()
{
    if (state == State.RECORDING)
    {

        audioRecorder.stop();   

        Thread t1 = t;

        t=null;

        t1.interrupt();

        count =0;

        state = State.STOPPED;

    }
    else
    {
        Log.e(AudioRecorder.class.getName(), "stop() called on illegal state");

        state = State.ERROR;
    }
}

public void release()
{
    if (state == State.RECORDING)
    {
        stop();
    }

    if (audioRecorder != null)
    {
        audioRecorder.release();

    }


}

public void reset()
{
    try
    {
        if (state != State.ERROR)
        {
            release();              
        }
    }
    catch (Exception e)
    {
        Log.e(AudioRecorder.class.getName(), e.getMessage());

        state = State.ERROR;
    }
}


public State getState()
{
    return state;
}
}

现在,创建服务并调用start()方法并为您的目的操作录制的音频缓冲区。

希望它会帮助你。

答案 1 :(得分:3)

要在背景中开始录制,您可以

  • 创建一个thread并在一个帖子中进行录制。

  • 创建一个将在后台运行的service

希望它有所帮助。

编辑1

Thread recordInBackGround= new Thread(new Runnable() {
                    @Override
                    public void run() { 
//Your recording portion of the code goes here.
}
});

recordInBackGround.start();