AudioRecord - 如何让数据缓冲?(AudioRecord - how to get d

2019-07-04 01:15发布

我在使用有类AudioRecord一些问题。 我想存储在缓冲区中记录的数据,但我不知道什么是实现这一正确的方法。 我经历的例子大量去,但其中大多数是comlicated和代表许多不同的方法。 我在找一个简单或简单的解释。

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

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();
}

我知道我” M应该使用.read(短[] audioData,INT offsetInShorts,INT sizeInShorts)函数。 在这里,我的问题开始。 我不知道如何audioData缓冲区的工作 - 我认为函数将记录样品到audioData。 如果完全充满的数据会发生什么? 它开始从最早的位置重写? 如果是这样,我相信我有somwhere否则复制所有收集到的样本。 这引发了另一个问题 - 我该如何检查是否.read(...)函数缓冲区已满? 我需要测量的时间和复制缓冲区的内容或有另一种方式来达到呢? 此外,我需要创建整个记录操作的线程?

对不起,问这么多问题一个主题:)

Answer 1:

回答您的问题::

recorder.read(......)并不一定读取任何数据。 你或许应该重写循环暂停通话阅读之间的短一段时间(例如,50毫秒)。 它应该也不会排队缓冲区,直到缓冲区有数据。 此外,由于缓冲可能不完整,你可能需要使用维护的字节数的计数的数据结构。 字节缓冲区想到作为一个很好的候选人。 您可以填充字节到它在读取循环,当它得到足够充分,排队它的传输,并开始另一个。

offcourse你需要创建一个线程循环吧。 如以下代码所示。

这里的记录循环,它正确的错误检查的修改版本。 它使用一个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()或你不会得到任何数据。

对于工作样品看看这个例子 。



文章来源: AudioRecord - how to get data in to buffer?