gpt4 book ai didi

android - AudioRecord类中read方法的问题

转载 作者:塔克拉玛干 更新时间:2023-11-02 21:50:36 26 4
gpt4 key购买 nike

public int read (byte[] audioData, int offsetInBytes, int sizeInBytes).

此方法从音频硬件读取音频数据以记录到缓冲区中。

它的参数是: audioData 写入录制音频数据的数组。 audioData 中的 offsetInBytes 索引,数据从中写入,以字节表示。 sizeInBytes 请求的字节数。

它返回 读取的字节数 或 ERROR_INVALID_OPERATION 如果对象未正确初始化,或者 ERROR_BAD_VALUE 如果参数未解析为有效数据和索引。字节数不会超过 sizeInBytes。

我在我的代码中这样写了这个方法:整数;字节[] buf = 新字节[160];num = record.read(buf, 0, 160);

问题是它总是返回160(即请求读取的字节)不小于160,即使没有数据。有什么问题?帮我。提前致谢。

最佳答案

更新:Android 中的这个错误在 4.2.2 之后和 5.01 之前的某处得到修复。在 5.01 上,回调的工作方式与文档所说的完全一样。

看起来 read 由于开发人员的一些短视而阻塞。

基本上,当录音机被初始化时,它会分配一种环形缓冲区,当它被告知 .start() 时,它就会开始录制到该缓冲区。

然后当 .read() 被调用时,它最多读取缓冲区大小的一半(或请求的大小,以较小者为准)并返回。

如果它想要读取 1000 个样本而只有 900 个可用,则必须等待再读取 100 个样本才能返回。但是,如果样本超过 1000 个,它会立即读取这些样本,然后立即返回。

理想情况下,它们要么提供非阻塞读取,以便返回任何可用的数据,要么提供一种方法来了解何时可以进行完整读取的数据,以便执行非阻塞读取。

我认为他们不支持第一个。他们似乎试图通过使用 set period 回调方法来支持第二种方法,但到目前为止,我无法在正确的时间获得该回调以进行快速的非阻塞读取。

我已经克隆了 native C++ 源代码的完整源代码(8.5G 字节),我正在尝试跟踪所有层的功能以了解它应该如何工作。

非阻塞.read(0)ing 的诀窍是仅在准备好完整读取的样本时才读取。但确定该条件何时为真是我尚未弄清楚的。

引用资料:下面是调用 native C++ 函数的 .read() 的 Java 代码:

http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/2.3.4_r1/android/media/AudioRecord.java#AudioRecord.read%28java.nio.ByteBuffer%2Cint%29

上面的 read() 方法调用了原生的 native_read_in_direct_buffer(),它位于:

http://pdroid.googlecode.com/svn/android-2.3.4_r1/trunk/frameworks/base/core/jni/android_media_AudioRecord.cpp

它调用或指向 android_media_AudioRecord_readInByteArray(),后者又调用 frameworks/base/media/libmedia/frameworks/base/中的 AudioRecord.read() media/libmedia/AudioRecord.cpp (据我所知)并且看起来在这个函数中有一个 do/while 循环,它基本上阻塞直到读取了所需的字节数(或缓冲区大小的一半,以较小者为准。)

我试图让回调函数正常运行,但它们似乎只在 read() 必须等待音频缓冲区填满才能返回时才回调——所以有什么意义呢。

我的下一个目标是尝试追踪通知回调源代码,这样我就可以准确地猜测它应该做什么以及什么时候做。

关于android - AudioRecord类中read方法的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4569421/

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