gpt4 book ai didi

android - AudioRecord - 如何将数据放入缓冲区?

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:39:55 27 4
gpt4 key购买 nike

我在使用 AudioRecord 类时遇到了一些问题。我想将记录的数据存储在缓冲区中,但我不确定实现该目的的正确方法是什么。我经历了大量的例子,但其中大多数都很复杂并且代表了许多不同的方法。我正在寻找简单的一个或简单的解释。

这是我的项目的音频设置:

int audioSource = AudioSource.MIC;
int sampleRateInHz = 8000;
int channelConfig = AudioFormat.CHANNEL_IN_MONO;
int audioFormat = AudioFormat.ENCODING_PCM_16BIT;
int bufferSizeInBytes = AudioRecord.getMinBufferSize(sampleRateInHz, channelConfig, audioFormat);

short[] buffer = new short[bufferSizeInBytes];

AudioRecord audioRecorder = new AudioRecord(audioSource,
sampleRateInHz,
channelConfig,
audioFormat,
bufferSizeInBytes);

我正在尝试创建一个录音功能:

public void Recording() {
audioRecorder.startRecording();
...
audioRecorder.stop();
audioRecorder.release();
}

我知道我应该使用 .read(short[] audioData, int offsetInShorts, int sizeInShorts) 函数。我的问题从这里开始。我不确定 audioData 缓冲区是如何工作的 - 我假设函数将录制的样本放入 audioData。如果它完全充满数据会怎样?它从最早的位置开始重写?如果确实如此,我相信我必须在其他地方复制所有收集的样本。它提出了另一个问题 - 我如何检查 .read(...) 函数缓冲区是否已满?我是否需要测量时间并复制缓冲区内容,或者有另一种方法可以实现吗?我还需要为整个录制操作创建一个线程吗?

很抱歉在一个主题中问了这么多问题:)

最佳答案

回答您的问题::

recorder.read(...) 不一定读取任何数据。您可能应该重写该循环以在读取调用之间暂停片刻(例如 50 毫秒)。在缓冲区有数据之前,它也不应该对缓冲区进行排队。此外,由于缓冲区可能未满,您可能需要使用一种数据结构来维护字节数。 ByteBuffer 是一个不错的选择。您可以在读取循环中将字节填充到其中,当它足够满时,将其排队等待传输并开始另一个。

当然你需要创建一个线程来循环它。如下代码所示。

这是进行正确错误检查的记录循环的修改版本。它使用 Queue<ByteBuffer>而不是 Queue<byte[]> :

private void startRecording() {

recorder.startRecording();
isRecording = true;
recordingThread = new Thread(new Runnable() {

@Override
public void run() {
bData = ByteBuffer.allocate(BufferElements);
bbarray = new byte[bData.remaining()];
bData.get(bbarray);
while (isRecording) {

int result = recorder.read(bbarray, 0, BufferElements);
System.out.println("READ DATA");
if (result > 0) {
qArray.add(bData);

--your stuffs--
bData = ByteBuffer.allocate(BufferElements);
} else if (result == AudioRecord.ERROR_INVALID_OPERATION) {
Log.e("Recording", "Invalid operation error");
break;
} else if (result == AudioRecord.ERROR_BAD_VALUE) {
Log.e("Recording", "Bad value error");
break;
} else if (result == AudioRecord.ERROR) {
Log.e("Recording", "Unknown error");
break;
}
try {
Thread.sleep(10);
} catch (InterruptedException e) {
break;
}
}
}
}, "AudioRecorder Thread");
recordingThread.start();
}

当然,您需要在某个地方调用 recorder.startRecording()否则您将得不到任何数据。

工作 sample 看at this example .

关于android - AudioRecord - 如何将数据放入缓冲区?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13492653/

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