问题标签 [audioqueueservices]

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 投票
1 回答
700 浏览

iphone - 如何使用音频队列服务播放下一个文件

使用音频队列服务播放下一个文件的正确方法是什么?当按下“播放下一个”按钮时,我应该先调用 AudioQueueStop,然后再调用 AudioQueuePrime/AudioQueueStart,还是只用下一个文件数据填充缓冲区就足够了?

问题是后者在 iPhone 上给我带来了声音故障。

0 投票
1 回答
1188 浏览

iphone - iPhone上的音频队列服务只播放第一个入队缓冲区?

我整晚都在想办法解决这个问题。我的代码与此处的 Apple 示例基本相同。但是,设备只播放队列中的第一个缓冲区(我在应用程序启动时听到第一个缓冲区的内容)。之后,设备根本不会发出声音。尽管 AQS 继续触发我的功能,但播放仍在运行AudioQueueOutputCallback。此外,对 AQS 的每次调用都返回 0,因此没有失败。

现在,只要我AudioQueueEnqueueBuffer从回调函数中调用,我就可以播放后续缓冲区。这不起作用,因为我只能从我的AudioFileStream_PacketsProc回调中填充缓冲区并将其排入队列,因为数据来自套接字并进入AudioFileStreamParseBytes.

其他人有这个问题吗?对我来说,这似乎是 AQS 中的一个错误......

谢谢,安德鲁

0 投票
1 回答
1614 浏览

iphone - AudioQueueGetProperty 返回 kAudioQueueProperty_CurrentLevelMeter 属性的超出范围的值

我正在编写一个要求用户处于安静环境中的应用程序。为此,我会定期检查麦克风的功率读数。(我知道返回的值在 dBFS 中,或者在这种情况下,是区间 [0, 1] 中的浮点数。)

我的问题是下面的代码工作得很好......除非它返回18466064732283753157623808.00000。我没有看到 NSLog 输出表明 AudioQueueGetProperty 返回失败。奇怪的值总是提到的值。

是什么赋予了?值的位模式是否可能提供线索?

0 投票
2 回答
1685 浏览

iphone - 操作 AudioQueueBuffer 音频数据会产生噪音

我尝试使用 SpeakHere 示例应用程序作为起点来实现 iPhone 声音处理应用程序。该应用程序涉及在播放期间操作缓冲的音频样本。当我将样本乘以一个小数(例如 0.9)时,我会得到噪音。最奇怪的是,当将样本乘以整数(如 1.0、2.0)或从它们中添加或减去时,播放的声音与预期的一样。

我正在使用以下代码片段在 AudioPlayer.m 的播放回调函数中执行此操作:

完整的项目可以在这里下载:http: //depositfiles.com/files/lmnkq68n8

谁能指出我做错了什么?我已经为此苦苦挣扎了几天,我完全迷路了。

谢谢!

0 投票
1 回答
658 浏览

iphone - 音频队列:记录缓冲区的时间戳

我正在尝试从我的AudioInputCallback函数中记录的缓冲区中获取时间以用于记录队列。不幸的是,我看到的时间戳并不像预期的那样。这是一个示例(使用AudioTimeStamp.mHostTime):

第一个时间戳是缓冲时间,第二个是参考时间(按下按钮的时间,我正在使用AudioQueueDeviceGetCurrentTime),第三个是两者之间的增量。正如预期的那样,缓冲区稍微滞后于“实时”,并在运行几个缓冲区回调后赶上。

现在,当关闭和重新打开这个队列时,情况就大不相同了:

如您所见,时间戳(我想是 ns ?)第二次完全不同。他们没有赶上实时几秒钟。这种行为根本无法重现——时间戳有时是正确的,有时是错误的。然而,当我第一次打开队列时,他们总是错的。

0 投票
1 回答
865 浏览

iphone - 中断后,录制时延迟音频路由更改通知

我的 iPhone 应用程序要求我知道用户何时插入/未插入耳机。这很容易。带有监听 kAudioSessionProperty_AudioRouteChange 的回调的 AudioSessionAddPropertyListener。

当事情发生时,我用 NSLog 写日志。用户插入耳机?在 gdb 控制台中获取通知和一行。用户拔下耳机?同上。

同时,我通过启动录音队列来感知环境的噪音水平。这也很有效:我可以很好地获取麦克风噪音水平并聆听音频路径的变化。

我发现在中断后,我重新激活了音频会话并将音频类别恢复为 kAudioSessionCategory_RecordAudio,音频路由通知有点混乱。

当我插入耳机时,我看不到任何通知。当我拔下耳机时,我会快速连续看到“插入”通知和“未插入”通知。

这就像“插入”通知延迟了,当“未插入”通知到达时,待处理通知的队列被刷新。

我究竟做错了什么?如何正确恢复音频会话以获取及时通知?

编辑:iPhone OS 3.1.2,在 iPhone 3G 上运行。我正在运行一个使用 3.0 SDK 编译的程序(来自 XCode 3.1.2)。

0 投票
3 回答
9834 浏览

objective-c - Objective-c - 如何将音频文件序列化为可以播放的小数据包?

因此,我想获取一个声音文件并将其转换为数据包,然后将其发送到另一台计算机。我希望另一台计算机能够在数据包到达时播放它们。

我正在使用 AVAudioPlayer 尝试播放此数据包,但我找不到正确的方法来序列化 peer2 可以播放的 peer1 上的数据。

场景是,peer1 有一个音频文件,将音频文件拆分为许多小数据包,将它们放在一个 NSData 上并将它们发送给 peer2。对等方 2 接收数据包并在它们到达时一一播放。

有谁知道该怎么做?或者即使有可能?

编辑:

这是一些代码来说明我想要实现的目标。

所以,这就是我想要实现的......所以,我真正需要知道的是如何创建数据包,以便 peer2 可以播放音频。

这将是一种流媒体。是的,现在我不担心接收或播放数据包的顺序......我只需要对声音进行切片,他们就可以播放每个片段,每个片段,而无需等待整个文件由 peer2 接收。

谢谢!

0 投票
1 回答
2238 浏览

objective-c - 在 iPhone 上录制音频并使用 NSOutputStream 通过网络发送

我正在编写一个 iPhone 应用程序,它需要从内置麦克风录制音频,然后将该音频数据发送到服务器进行处理。

该应用程序使用套接字连接连接到服务器并使用音频队列服务进行录制。我不确定何时实际发送数据。音频队列服务每次在缓冲区中填充一些音频数据时都会触发回调。NSOutputStream 每次有可用空间时都会触发一个事件。

我的第一个想法是在音频队列回调中将数据发送到服务器。但是,如果 NSOutputStream 当时没有可用空间,这似乎会遇到问题。

然后我考虑缓冲从音频队列返回的数据,并在每次 NSOutputStream 触发可用空间事件时发送一些数据。但这似乎有问题,如果发送到服务器先于音频录制,则会出现在可用空间事件上没有任何内容可写的情况,因此不会再次触发该事件并且数据传输将有效地停止。

那么处理这个问题的最佳方法是什么?我是否应该有一个重复触发的计时器并查看是否有可用空间以及需要发送的数据?此外,我认为我需要进行一些线程同步,以便我可以从缓冲区中取出数据块以通过网络发送,但也可以在录制进行时将数据块添加到缓冲区,而不会冒损坏缓冲区的风险。

0 投票
1 回答
1576 浏览

iphone - 如何开始写出现有的 AudioQueue 以响应事件?

我正在编写一个打开 AudioQueue 并分析其特征的类,然后在某些条件下可以开始或结束从该 AudioQueue 中写出已经实例化的文件。这是我的代码(完全基于 SpeakHere)打开 AudioQueue 而不向 tmp 写入任何内容:

但我有点不清楚如何编写一个函数来告诉这个队列“从现在到停止信号,开始将此队列作为文件写入 tmp”。我了解如何告诉 AudioQueue 在创建时作为文件写出,如何设置文件格式等,但不知道如何告诉它在中途开始和停止。非常感谢任何指针,谢谢。

0 投票
1 回答
217 浏览

objective-c - 录制音频时 AudioQueueServices 回调的意外行为

我正在使用 AudioQueueServices 记录连续的数据流。据我了解,只有当缓冲区充满数据时才会调用回调。在实践中,第一个回调有一个完整的缓冲区,第二个回调是 3/4 满,第三个回调是满的,第四个是 3/4 满,依此类推。这些缓冲区是 8000 个数据包(记录 8khz 音频) - 所以我应该每次都将 1s 的音频返回给回调。我已经确认我的音频队列缓冲区大小是正确的(并且在某种程度上被行为所证实)。我究竟做错了什么?我应该在 AudioQueueNewInput 中使用不同的 RunLoop 做某事吗?我试过了,但这似乎没有什么不同......

顺便说一句,如果我在调试器中运行,每个回调充满了 8000 个样本——这让我觉得这是一个线程/计时的事情。