如何在后台持续android中录制音频/语音? [英] How to record audio/voice in background continuously in android?

查看:957
本文介绍了如何在后台持续android中录制音频/语音?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

至于我想记录的背景音乐,我用service..But我不能够记录在服务音频。

As I want to record audio in background I use service..But I am not able to record the audio in service.

我想同样的code的活动是为我工作。但如何做录音在后台时,声音/语音输入,这意味着录音应该开始,如果有声音输入,这应该是在后台...?

I tried same code in Activity it works for me. but how to do audio recording in background when voice /speech is input that means audio recording should start if there is voice input and that should be in background...?

推荐答案

在我的项目,我有这个要求,从麦克风连续记录的音频之一。我不能共享项目,但我可以分享具体的AudioRecorder类。

in one of my project i had this requirement to continuously record audio from Microphone. i can not share the project but i can share the specific AudioRecorder class.

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()方法和操作录制的音频缓冲供您使用。

Now, Create Service and just call start() method and manipulate your recorded audio buffer for your purpose.

希望这将有助于你。

这篇关于如何在后台持续android中录制音频/语音?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆