gpt4 book ai didi

android - 如何在android中连续录制后台音频/语音?

转载 作者:塔克拉玛干 更新时间:2023-11-01 21:20:47 29 4
gpt4 key购买 nike

因为我想在后台录制音频,所以我使用了服务..但是我无法在服务中录制音频。

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

最佳答案

在我的一个项目中,我需要连续录制来自麦克风的音频。我无法共享该项目,但我可以共享特定的 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() 方法并根据您的目的操作录制的音频缓冲区。

希望对您有所帮助。

关于android - 如何在android中连续录制后台音频/语音?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10025824/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com