gpt4 book ai didi

android - 如何在 Android 中使用音频 api 录制音频?

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:06:09 26 4
gpt4 key购买 nike

我有一部版本为 2.3.3 的 LG Android 手机。我需要在耳机插孔中连接一个麦克风,因为我想创建一个读取声音样本的应用程序。

如何以编程方式读取样本?

最佳答案

如果您真的想阅读 AudioSamples,我建议您使用 AudioRecord 而不是 MediaRecorder,因为它可以让您更好地控制 AudioSamples... 为此,您可以使用以下代码,AudioCapturer 是我的包装类,我用它来获取来自 AudioRecord 对象的样本。IAudioReceiver 是一个具有处理音频数据方法的接口(interface)。

public class AudioCapturer implements Runnable {

private AudioRecord audioRecorder = null;
private int bufferSize;
private int samplePerSec = 16000;
private String LOG_TAG = "AudioCapturer";
private Thread thread = null;

private boolean isRecording;
private static AudioCapturer audioCapturer;

private IAudioReceiver iAudioReceiver;

private AudioCapturer(IAudioReceiver audioReceiver) {
this.iAudioReceiver = audioReceiver;
}

public static AudioCapturer getInstance(IAudioReceiver audioReceiver) {
if (audioCapturer == null) {
audioCapturer = new AudioCapturer(audioReceiver);
}
return audioCapturer;
}

public void start() {

bufferSize = AudioRecord.getMinBufferSize(samplePerSec, AudioFormat.CHANNEL_IN_MONO, AudioFormat.ENCODING_PCM_16BIT);

if (bufferSize != AudioRecord.ERROR_BAD_VALUE && bufferSize != AudioRecord.ERROR) {

audioRecorder = new AudioRecord(MediaRecorder.AudioSource.DEFAULT, this.samplePerSec, AudioFormat.CHANNEL_IN_MONO,
AudioFormat.ENCODING_PCM_16BIT, this.bufferSize * 10); // bufferSize
// 10x

if (audioRecorder != null && audioRecorder.getState() == AudioRecord.STATE_INITIALIZED) {
Log.i(LOG_TAG, "Audio Recorder created");


audioRecorder.startRecording();
isRecording = true;
thread = new Thread(this);
thread.start();

} else {
Log.e(LOG_TAG, "Unable to create AudioRecord instance");
}

} else {
Log.e(LOG_TAG, "Unable to get minimum buffer size");
}
}

public void stop() {
isRecording = false;
if (audioRecorder != null) {
if (audioRecorder.getRecordingState() == AudioRecord.RECORDSTATE_RECORDING) {
// System.out
// .println("Stopping the recorder inside AudioRecorder");
audioRecorder.stop();
}
if (audioRecorder.getState() == AudioRecord.STATE_INITIALIZED) {
audioRecorder.release();
}
}
}

public boolean isRecording() {
return (audioRecorder != null) ? (audioRecorder.getRecordingState() == AudioRecord.RECORDSTATE_RECORDING) : false;
}

@Override
public void run() {
android.os.Process.setThreadPriority(android.os.Process.THREAD_PRIORITY_URGENT_AUDIO);
while (isRecording && audioRecorder.getRecordingState() == AudioRecord.RECORDSTATE_RECORDING) {
short[] tempBuf = new short[Constants.FRAME_SIZE / 2];
audioRecorder.read(tempBuf, 0, tempBuf.length);
iAudioReceiver.capturedAudioReceived(tempBuf, false);
}
}

/*
* (non-Javadoc)
*
* @see java.lang.Object#finalize()
*/
@Override
protected void finalize() throws Throwable {
super.finalize();
System.out.println("AudioCapturer finalizer");
if (audioRecorder != null && audioRecorder.getState() == AudioRecord.STATE_INITIALIZED) {
audioRecorder.stop();
audioRecorder.release();
}
audioRecorder = null;
iAudioReceiver = null;
thread = null;
}

}

现在您可以在您的程序的主类中使用此类的对象,它会开始为您提供音频样本,您可以在 IAudioReceiver(使用这些样本的类)中处理它们。

如果您仍想使用 MediaRecorder,this link对你有用,

关于android - 如何在 Android 中使用音频 api 录制音频?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11440654/

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