问题标签 [android-audiorecord]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
4 回答
14466 浏览

android - Android:AudioRecord 类问题:从不调用回调

我的 Android Java 应用程序需要将音频数据记录到 RAM 中并进行处理。这就是我使用“AudioRecord”类而不是“MediaRecorder”(仅记录到文件)的原因。

到现在为止,我对音频数据使用了带有“read()”的繁忙循环轮询。到目前为止,这一直有效,但它过多地与 CPU 挂钩。在两次轮询之间,我将线程置于睡眠状态以避免 100% 的 CPU 使用率。但是,这并不是一个真正干净的解决方案,因为不能保证睡眠时间,您必须减去安全时间才能不丢失音频片段。这不是 CPU 最优的。对于并行运行的线程,我需要尽可能多的空闲 CPU 周期。

现在我使用“OnRecordPositionUpdateListener”实现了录制。根据 SDK Docs,这看起来很有希望,也是正确的方法。一切似乎都正常(打开音频设备,读取()数据等),但从未调用过 Listner。

有人知道为什么吗?

信息:我正在使用真正的设备,而不是在模拟器下。使用忙碌循环的录音基本上可以工作(但不能令人满意)。只有回调监听器永远不会被调用。

这是我的源代码中的一个片段:

0 投票
1 回答
3387 浏览

android - 在android中使用带有8位编码的AudioRecord

我制作了一个使用 AudioRecord 和 16 位编码从手机麦克风录制的应用程序,并且我能够播放录音。出于某种兼容性原因,我需要使用 8 位编码,但是当我尝试使用该编码运行相同的程序时,我不断收到无效的音频格式。我的代码是:

有谁知道是什么问题?根据文档 AudioRecord 能够进行 8 位编码。

0 投票
4 回答
2435 浏览

android - AudioRecord 不适用于摩托罗拉里程碑

我只在摩托罗拉里程碑上遇到这个问题。代码:

我拥有的错误信息(暂时找不到更多信息,因为我自己没有用于调试的里程碑):

显然我不是唯一一个遇到这个问题的人。我发现了一些非常相似的线程(没有解决方案):

http://groups.google.com/group/android-developers/browse_thread/thread/6dd24aeb484b2e40 http://web.archive.org/web/20100824043744/http://androidcommunity.com:80/forums/f2/problem -using-audiorecord-in-motorola-milestone-30935/ http://community.developer.motorola.com/t5/Android-App-Development-for/Problem-using-AudioRecord-on-Milestone-device/mp/3889 http://www.fring.com/forums/showthread.php?t=16194 http://groups.google.com/group/android-developers/browse_thread/thread/63be273ba59c635e/1c4a010fd470d328

0 投票
1 回答
1584 浏览

android - 非 HTC 设备的 AudioRecord 问题

我在使用 AudioRecord 时遇到问题。

使用从splmeter项目派生的一些代码的示例:

这在 HTC Dream 和 HTC Magic 上完美运行,没有任何日志警告/错误,但会导致模拟器和 Nexus One 设备出现问题。

在 Nexus 上,它根本不会返回有用的数据。我无法提供任何其他有用的信息,因为我有一个远程朋友进行测试。

在模拟器(Android 1.5、2.1 和 2.2)上,我从 AudioFlinger 和 AudioRecordThread 的缓冲区溢出中得到奇怪的错误。我的 UI 响应速度也大幅下降(即使录制发生在与 UI 不同的线程中)。

有什么明显的我做错了吗?我必须为 Nexus One 硬件做任何特别的事情吗?

编辑

我已经部分解决了这个问题...... AudioRecord的文档说:

返回成功创建 AudioRecord 对象所需的最小缓冲区大小。请注意,此大小并不能保证在负载下顺利录制,应根据 AudioRecord 实例轮询新数据的预期频率选择更高的值。对于新数据。

所以我将缓冲区长度更改为

现在模拟器运行良好。

硬件没有。虽然模拟器基于 8khz 从该调用返回 640 值(每秒进行 12.5 次轮询),但 HTC 硬件返回 4096!这意味着大约每秒 2 次轮询和半秒的音频延迟!此外,在 Nexus One 上的相同调用返回 8192!所以延迟了整整一秒!

我希望它就此结束,但是即使 HTC 设备和所有模拟器现在可以工作,nexus仍然没有返回任何音频(我自己仍然没有,所以我无法从其中获得正确的调试信息) (即使有些人比其他人更迟钝)。

我在这里做错了什么吗?

0 投票
2 回答
5009 浏览

android - Android AudioRecord 无法初始化

我在使用适用于 Android 的 AudioRecord 时遇到问题。我已经阅读了尽可能多的在线信息,但我似乎无法获得良好的初始化。我试过 Android 2.2 模拟器、1.5 模拟器和我的手机,一个运行 Froyo 的 HTC Incredible。模拟器和我的手机初始化失败。

我尝试了 8000、11025 和 44100 的采样率,CHANNEL_IN_MONO/STEREO 和 CHANNEL_CONFIGURATION_MONO/STEREO 的格式,8 位和 16 位编码(8 位使 getMinBufferSize 失败),以及 MIC 和 DEFAULT 的 AudioSource。运行获取状态(初始化失败)后,所有结果都会导致变量 test 变为 0。

从我读过的所有内容看来,这应该正确初始化对象。我玩过 buflen 上的乘数,使其范围从 512(函数的结果)到 102400,因为我听说 HTC 设备需要高于 8192 的值。

为了测试我的问题,我创建了一个新的小项目,尽可能简单地重现我的问题。我将所需的常量提取到本地整数中,然后运行构造函数并访问 getState 方法以检查它是否有效。

0 投票
4 回答
22911 浏览

android - Android AudioRecord 初始化每次都失败

我的问题很容易解释——我试图创建一个 AudioRecord 对象,但它无法初始化(即在构造函数之后,getState 返回 0,表示失败)。我在运行 OS 2.2.1 的 MotoDroid 1 上从 Eclipse 运行它。我的 AndroidManifest.xml 是,AFAIK,使用正确的权限,RECORD_AUDIO(我不知道如何确认):

我执行以下操作来创建 AudioRecord:

audioRecorder.getState() 返回 0(即 STATE_UNINITIALIZED)

我还没有找到任何使用此 API 的完整示例,而且我是一名 Android 初学者,所以解决方案可能很简单。我该怎么做才能找出失败的原因?

一些人提出了类似的问题,但他们肯定遇到了与我不同的问题,因为他们批准的修复对我没有帮助。最值得注意的是这个。但是批准的解决方案令人困惑,无论如何都对我不起作用。我还尝试了各种比特率(8000、16000、11025、44100),包括单声道和立体声以及 8 位和 16 位。没有组合返回成功初始化。

0 投票
1 回答
2291 浏览

android - Android AudioRecord 的 AudioHardwareALSA 错误

我正在开始一个我正在编写的简单 AudioRecord 应用程序,它从一堆这些开始:

然后这个:

这可能意味着什么?如有必要,我可以发布源代码,但我正在寻找这些错误可能指的是什么以及为什么在这种情况下可能会发生缓冲区溢出的基本答案。谢谢。

0 投票
2 回答
5732 浏览

android - AudioRecord 类中读取方法的问题

公共 int 读取 (byte[] audioData, int offsetInBytes, int sizeInBytes)。

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

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

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

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

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

0 投票
1 回答
453 浏览

java - 使用 AudioRecord 录制音频时的停止按钮

目前我有这个网站的代码(链接文本)工作得很好。在网站上的示例中,它开始录制 10 秒,然后立即反向播放音频。我已修改代码以在按下按钮时开始录制,但只能让它录制 10 秒,然后保存该文件。我希望能够通过按下按钮开始录制,然后在按下不同的按钮时停止录制。我有一个想法,它可能是线程对象的 wait() 方法的中断,但不知道如何实现它。我的代码如下:

有相当多的代码,所以我只发布了我认为相关的部分。如果需要更多,请询问。

谢谢。

0 投票
4 回答
49674 浏览

java - 如何在不录制的情况下在 Android 上对麦克风进行采样以获得实时幅度/电平?

我试图在 Android 上获得麦克风的振幅水平,如下所示:

不幸的是,这只总是返回 0。

看来,要使它起作用,我必须实际开始录制。那是对的吗?

如果是这样,我是否需要记录 500 毫秒,获取幅度,停止记录并重复?

最后,我必须记录到文件吗?我不需要保存这个音频文件,难道我不能只获取当前实时麦克风输入自上次调用以来的当前幅度或最高幅度而不进行录音吗?

任何帮助表示赞赏,谢谢。