如何在android中连续在后台录制音频/语音?
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/10025824/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
How to record audio/voice in background continuously in android?
提问by Dipali
As I want to record audio in background I use service..But I am not able to record the audio in service.
因为我想在后台录制音频,所以我使用服务..但我无法在服务中录制音频。
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...?
我在 Activity 中尝试了相同的代码,它对我有用。但是如何在输入语音/语音时在后台进行录音,这意味着如果有语音输入并且应该在后台进行录音,则应该开始录音......?
回答by N.Droid
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.
在我的一个项目中,我要求从麦克风连续录制音频。我无法共享该项目,但我可以共享特定的 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;
}
}
Now, Create Service and just call start() method and manipulate your recorded audio buffer for your purpose.
现在,创建服务并调用 start() 方法并根据您的目的操作您录制的音频缓冲区。
Hope it will Help you.
希望它会帮助你。
回答by Deva
For starting the recording in backgroun you can either
要在后台开始录制,您可以
Hope it helps.
希望能帮助到你。
Edit 1
编辑 1
Thread recordInBackGround= new Thread(new Runnable() {
@Override
public void run() {
//Your recording portion of the code goes here.
}
});
recordInBackGround.start();