问题标签 [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.
ios - 使用 AVAudioEngine 从 AVAudioPCMBuffer 播放音频
我有两个班级MicrophoneHandler
, 和AudioPlayer
。我已经设法使用此处AVCaptureSession
批准的答案来窃听麦克风数据,并将其转换为使用此功能:CMSampleBuffer
NSData
我现在想通过将NSData
上面生成的音频转换为AVAudioPCMBuffer
并使用AVAudioEngine
. 我的AudioPlayer
班级如下:
缓冲区到达handleBuffer:buffer
self.delegate.handleBuffer(result)
在上面的第一个片段中调用函数。
我能够print(newBuffer)
看到转换后的缓冲区的内存位置,但扬声器什么也没有。我只能想象到和 from 的转换之间存在一些不一致的地方NSData
。有任何想法吗?提前致谢。
ios - iOS:睡眠后 AVAudioEngine 未启动
我们仅在 iPhone 6S plus 设备上重现的 AVEngine 存在问题。它适用于我们拥有的其他设备,例如 iPhone5s、iPhone6、iPad……我们使用 AVEngine 通过输入节点上的点击节点进行音频捕获。
我们注意到,当 AVEngine 处于暂停或停止状态时,睡眠模式(睡眠按钮)会产生一个“AVAudioEngineConfigurationChangeNotification”调用(当 AVEngine 正在运行时,我们可以进入睡眠状态并且 AVEngine 保持在运行状态)。
当我们从睡眠中退出并启动 AVEngine(启动时也不例外),这个总是停止,我们再次收到“AVAudioEngineConfigurationChangeNotification”......
下一个开始调用没有停止(没有通知),一切都再次正常工作。
有人已经用 AVEngine 观察到了这种奇怪的行为吗?有没有办法避免它?
问候,
洛伊克
ios - 使用 AVAudioEngine 录制到压缩文件
我正在尝试使用 AVAudioEngine 将来自麦克风的声音与各种音效文件一起录制到 AVAudioFile。
我像这样创建一个 AVAudioFile:
我在音频引擎的 mainMixerNode 上安装了一个水龙头,在那里我将缓冲区写入文件:
我self.engine.mainMixerNode.outputFormatForBus(0).settings
在创建音频文件时使用,因为 Apple 声明“缓冲区格式必须与文件的处理格式匹配,这就是为什么在创建上面的 AVAudioFile 对象时使用 outputFormatForBus: 的原因”。在 installTapOnBus 的文档中,他们还说:“指定总线上的抽头和连接格式(如果非零)应该相同”
但是,这给了我一个非常大的未压缩音频文件。我想将文件另存为 .m4a 但不明白在哪里指定我要使用的设置:
如果我在创建音频文件时传入这些设置,则应用程序会在我录制时崩溃。
关于如何解决这个问题的任何建议或想法?
ios - AVAudioEngine 可以创建的节点数量是否有限制?
在下面的代码中,我创建了两个声音,sound1 和 sound2。每个声音都包含许多样本,这些样本允许同时播放相同的声音。问题是,如果我创建看似超过 6 到 8 个 AVAudioPlayerNodes,每个节点都有一个 AVAudioUnitTimePitch,那么音频就会完全混乱。当我将样本数量增加得太高时,我什至无法播放单个声音。我不确定我的代码是否错误,或者 AVAudioEngine 的节点限制是多少。
ios - 更改 AVAudioNode 的输出格式
我正在尝试更改 a 的输出格式,AVAudioMixerNode
以便它以较低的采样率而不是默认格式输出单声道音频。我是否必须对类进行子AVAudioMixerNode
类化并覆盖outputFormatForBus
函数才能做到这一点,还是有其他方法?
ios - 使用后删除 AVAudioPlayerNode 会导致崩溃
我AVAudioEngine
用来播放声音文件并将输出记录到文件中。我有很多音效文件,每个都通过点击一个按钮来播放。为了播放文件,我创建了一个AVAudioPlayerNode
并将其连接到引擎。文件播放后,我尝试在 completionHandler 闭包中断开/分离节点,以释放内存。如果我不删除节点,我将继续向引擎添加新节点和新连接。
但是,下次我尝试播放文件时,应用程序就会冻结。这是我的代码:
实现这样的功能的最佳方式是什么,即在录制时播放多个文件,可能相互重叠?
ios - AVAudioEngine 用于录制麦克风和声音文件并避免反馈循环
我正在尝试使用 AVAudioEngine 录制来自麦克风和声音文件的声音(当用户点击按钮时播放)。我已经将 mic inputNode 连接到 mainMixer,以及几个用于播放声音文件的 AVAudioPlayerNodes。我在 mainMixer 上安装了一个水龙头来捕获声音并将其写入文件。声音也被路由到扬声器。
这是我的音频图的基本布局:
默认情况下,声音是通过接收器/耳机扬声器播放的,而不是 iPhone 底部的扬声器。
不幸的是,这意味着通过扬声器输出的声音太低且难以听到 - 我希望用户能够在播放和录制声音文件时听到它们。所以我希望通过底部扬声器播放音效。
如果我将音频会话更改为使用底部扬声器进行播放,我会得到一个反馈循环,因为麦克风输入和底部扬声器播放的声音都会再次被麦克风拾取。(奇怪的是,这适用于 iPad,没有创建反馈回路。当然,iPad 没有耳机,所以在该设备上,声音总是通过主扬声器听到。)
我有两个问题:
是否可以仅将声音文件路由到底部扬声器?我不想通过任何扬声器输出麦克风的声音。但是,麦克风的声音和声音文件都应该被记录下来。
为什么我在 iPhone 上得到反馈循环,但在 iPad 上却没有?是否可以在没有反馈回路的情况下通过底部扬声器输出所有声音?
swift - AVAudioFile.length 为 0 即使文件存在
我正在创建一个 AVAudioFile 用于将声音写入声音文件。如果文件已经存在,我想将 framePosition 移动到文件末尾,以在末尾继续写入,而不是替换现有文件。
我做了一些测试,试图将文件中的缓冲区读入一个具有不同 URL 的新文件,这样它就不会覆盖原始文件。当我尝试将缓冲区读入新文件时发生崩溃:
崩溃日志:由于未捕获的异常“com.apple.coreaudio.avfaudio”而终止应用程序,原因:“错误 -50”
伙计,我真的很讨厌 CoreAudio 崩溃日志。他们什么也没告诉我!
是否可以将数据读入为写入而创建的文件中?
更新
好的,所以在一些建议之后我做了一些改变。基本上,这些是我正在采取的步骤:
- 检查文件是否已经存在。
- 如果是,打开它进行读取并获取音频缓冲区。
- 创建一个用于写入的新文件(使用相同的文件 URL)
- 使用 writeFromBuffer 将缓冲区从旧文件写入新文件
- 将新文件的 framePosition 移动到末尾,以便我可以继续对其进行写入/录制。
但是,新文件的长度在我写入后为 0。
这是我的代码:
顺便说一句,readIntoBuffer 的命名让我非常困惑。听起来好像您应该使用该方法将文件读入缓冲区,但是根据文档,您应该使用它将缓冲区读入文件吗?那么为什么我不能使用该方法将缓冲区添加到我的文件中呢?为什么我必须使用 writeFromBuffer?
更新 2
所以,我设法解决了它。显然,我必须先调用 readIntoBuffer 才能使用数据实际填充缓冲区,然后才能使用它。所以我添加了这一行
后
ios - AVAudioEngine & AVAudioPlayerNode didFinish 方法,如 AVAudioPlayer
是否有可能确定是否AVAudioEngine
完成了播放的声音?过去我使用了AVAudioPlayer
's 功能:
现在我需要一些效果,但是没有AVAudioEnginge
提供标识播放声音结束的函数。
我搜索了很多,但不幸的是我在文档中只找到了这个函数AVAudioEngine
:
我目前的解决方案是检查“正在运行”的布尔值,如果它是假的,那么玩家就不再玩了。有人知道更好的解决方案AVAudioEngine
吗?非常感谢你!