问题标签 [avaudioengine]

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 回答
4181 浏览

ios - 使用 AVAudioEngine 从 AVAudioPCMBuffer 播放音频

我有两个班级MicrophoneHandler, 和AudioPlayer。我已经设法使用此处AVCaptureSession批准的答案来窃听麦克风数据,并将其转换为使用此功能:CMSampleBufferNSData

我现在想通过将NSData上面生成的音频转换为AVAudioPCMBuffer并使用AVAudioEngine. 我的AudioPlayer班级如下:

缓冲区到达handleBuffer:bufferself.delegate.handleBuffer(result)在上面的第一个片段中调用函数。

我能够print(newBuffer)看到转换后的缓冲区的内存位置,但扬声器什么也没有。我只能想象到和 from 的转换之间存在一些不一致的地方NSData。有任何想法吗?提前致谢。

0 投票
0 回答
214 浏览

ios - iOS:睡眠后 AVAudioEngine 未启动

我们仅在 iPhone 6S plus 设备上重现的 AVEngine 存在问题。它适用于我们拥有的其他设备,例如 iPhone5s、iPhone6、iPad……我们使用 AVEngine 通过输入节点上的点击节点进行音频捕获。

我们注意到,当 AVEngine 处于暂停或停止状态时,睡眠模式(睡眠按钮)会产生一个“AVAudioEngineConfigurationChangeNotification”调用(当 AVEngine 正在运行时,我们可以进入睡眠状态并且 AVEngine 保持在运行状态)。

当我们从睡眠中退出并启动 AVEngine(启动时也不例外),这个总是停止,我们再次收到“AVAudioEngineConfigurationChangeNotification”......

下一个开始调用没有停止(没有通知),一切都再次正常工作。

有人已经用 AVEngine 观察到了这种奇怪的行为吗?有没有办法避免它?

问候,

洛伊克

0 投票
0 回答
897 浏览

ios - 使用 AVAudioEngine 录制到压缩文件

我正在尝试使用 AVAudioEngine 将来自麦克风的声音与各种音效文件一起录制到 AVAudioFile。

我像这样创建一个 AVAudioFile:

我在音频引擎的 mainMixerNode 上安装了一个水龙头,在那里我将缓冲区写入文件:

self.engine.mainMixerNode.outputFormatForBus(0).settings在创建音频文件时使用,因为 Apple 声明“缓冲区格式必须与文件的处理格式匹配,这就是为什么在创建上面的 AVAudioFile 对象时使用 outputFormatForBus: 的原因”。在 installTapOnBus 的文档中,他们还说:“指定总线上的抽头和连接格式(如果非零)应该相同”

但是,这给了我一个非常大的未压缩音频文件。我想将文件另存为 .m4a 但不明白在哪里指定我要使用的设置:

如果我在创建音频文件时传入这些设置,则应用程序会在我录制时崩溃。

关于如何解决这个问题的任何建议或想法?

0 投票
1 回答
622 浏览

ios - AVAudioEngine 可以创建的节点数量是否有限制?

在下面的代码中,我创建了两个声音,sound1 和 sound2。每个声音都包含许多样本,这些样本允许同时播放相同的声音。问题是,如果我创建看似超过 6 到 8 个 AVAudioPlayerNodes,每个节点都有一个 AVAudioUnitTimePitch,那么音频就会完全混乱。当我将样本数量增加得太高时,我什至无法播放单个声音。我不确定我的代码是否错误,或者 AVAudioEngine 的节点限制是多少。

0 投票
1 回答
1218 浏览

ios - 更改 AVAudioNode 的输出格式

我正在尝试更改 a 的输出格式,AVAudioMixerNode以便它以较低的采样率而不是默认格式输出单声道音频。我是否必须对类进行子AVAudioMixerNode类化并覆盖outputFormatForBus函数才能做到这一点,还是有其他方法?

0 投票
1 回答
875 浏览

ios - 使用后删除 AVAudioPlayerNode 会导致崩溃

AVAudioEngine用来播放声音文件并将输出记录到文件中。我有很多音效文件,每个都通过点击一个按钮来播放。为了播放文件,我创建了一个AVAudioPlayerNode并将其连接到引擎。文件播放后,我尝试在 completionHandler 闭包中断开/分离节点,以释放内存。如果我不删除节点,我将继续向引擎添加新节点和新连接。

但是,下次我尝试播放文件时,应用程序就会冻结。这是我的代码:

实现这样的功能的最佳方式是什么,即在录制时播放多个文件,可能相互重叠?

0 投票
0 回答
717 浏览

ios - AVAudioEngine 用于录制麦克风和声音文件并避免反馈循环

我正在尝试使用 AVAudioEngine 录制来自麦克风和声音文件的声音(当用户点击按钮时播放)。我已经将 mic inputNode 连接到 mainMixer,以及几个用于播放声音文件的 AVAudioPlayerNodes。我在 mainMixer 上安装了一个水龙头来捕获声音并将其写入文件。声音也被路由到扬声器。

这是我的音频图的基本布局:

默认情况下,声音是通过接收器/耳机扬声器播放的,而不是 iPhone 底部的扬声器。

不幸的是,这意味着通过扬声器输出的声音太低且难以听到 - 我希望用户能够在播放和录制声音文件时听到它们。所以我希望通过底部扬声器播放音效。

如果我将音频会话更改为使用底部扬声器进行播放,我会得到一个反馈循环,因为麦克风输入和底部扬声器播放的声音都会再次被麦克风拾取。(奇怪的是,这适用于 iPad,没有创建反馈回路。当然,iPad 没有耳机,所以在该设备上,声音总是通过主扬声器听到。)

我有两个问题:

  1. 是否可以仅将声音文件路由到底部扬声器?我不想通过任何扬声器输出麦克风的声音。但是,麦克风的声音和声音文件都应该被记录下来。

  2. 为什么我在 iPhone 上得到反馈循环,但在 iPad 上却没有?是否可以在没有反馈回路的情况下通过底部扬声器输出所有声音?

0 投票
1 回答
1840 浏览

swift - AVAudioFile.length 为 0 即使文件存在

我正在创建一个 AVAudioFile 用于将声音写入声音文件。如果文件已经存在,我想将 framePosition 移动到文件末尾,以在末尾继续写入,而不是替换现有文件。

我做了一些测试,试图将文件中的缓冲区读入一个具有不同 URL 的新文件,这样它就不会覆盖原始文件。当我尝试将缓冲区读入新文件时发生崩溃:

崩溃日志:由于未捕获的异常“com.apple.coreaudio.avfaudio”而终止应用程序,原因:“错误 -50”

伙计,我真的很讨厌 CoreAudio 崩溃日志。他们什么也没告诉我!

是否可以将数据读入为写入而创建的文件中?

更新

好的,所以在一些建议之后我做了一些改变。基本上,这些是我正在采取的步骤:

  1. 检查文件是否已经存在。
  2. 如果是,打开它进行读取并获取音频缓冲区。
  3. 创建一个用于写入的新文件(使用相同的文件 URL)
  4. 使用 writeFromBuffer 将缓冲区从旧文件写入新文件
  5. 将新文件的 framePosition 移动到末尾,以便我可以继续对其进行写入/录制。

但是,新文件的长度在我写入后为 0。

这是我的代码:

顺便说一句,readIntoBuffer 的命名让我非常困惑。听起来好像您应该使用该方法将文件读入缓冲区,但是根据文档,您应该使用它将缓冲区读入文件吗?那么为什么我不能使用该方法将缓冲区添加到我的文件中呢?为什么我必须使用 writeFromBuffer?

更新 2

所以,我设法解决了它。显然,我必须先调用 readIntoBuffer 才能使用数据实际填充缓冲区,然后才能使用它。所以我添加了这一行

0 投票
1 回答
954 浏览

ios - AVAudioEngine 离线渲染:仅在连接耳机时静音输出

我一直在开发一个应用程序,它使音频管道通过AVAudioEngine然后渲染到文件中。

我一直在使用这个代码示例的方法,适合我自己的需要。问题是如果耳机连接到设备,输出音频文件是无声的。您可以通过连接耳机运行该项目来观察这一点。

我唯一的想法是 iPhone 通常有一个单声道outputNode,但耳机给它一个立体声格式。我发现这些东西很难调试,所以任何指针都值得赞赏。

我从这里得到了示例代码,这可能会提供有关该问题的更多上下文。

谢谢

0 投票
2 回答
2558 浏览

ios - AVAudioEngine & AVAudioPlayerNode didFinish 方法,如 AVAudioPlayer

是否有可能确定是否AVAudioEngine完成了播放的声音?过去我使用了AVAudioPlayer's 功能:

现在我需要一些效果,但是没有AVAudioEnginge提供标识播放声音结束的函数。

我搜索了很多,但不幸的是我在文档中只找到了这个函数AVAudioEngine

我目前的解决方案是检查“正在运行”的布尔值,如果它是假的,那么玩家就不再玩了。有人知道更好的解决方案AVAudioEngine吗?非常感谢你!