由于我想在后台录制音频,我使用的是服务。但是我无法录制音频。
我在Activity中尝试了相同的代码,它对我有用。但是当输入语音/语音时如何在后台进行录音,这意味着如果有语音输入应该开始录音,那应该是在后台......?
答案 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)