问题标签 [avaudioplayernode]

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 投票
0 回答
1115 浏览

swift - AVAudioPlayer.play() 有效,但 AVAudioPlayerNode.play() 失败

我有以下使用 AVAudioPlayerNode 播放音频文件的 Swift Playground 代码。

当使用内置扬声器或连接到 UE WONDERBOOM 蓝牙扬声器时,这在我的 mac mini 上运行良好。但是,当连接到 UE BOOM 2 蓝牙扬声器时,它会崩溃。

AVAudioPlayer我尝试过的所有扬声器都可以正常使用,包括 UE BOOM 2 。

异常消息是“当引擎未运行时播放器启动”但是插入打印命令显示引擎在playerNode.play()被调用之前正在运行。

这是堆栈跟踪的(部分)。

堆栈跟踪

在这种情况下,EXC_BAD_INSTRUCTION 表示什么?

为了消除由于使用 Swift 游乐场而引入错误行为的可能性,我还创建了一个 Swift macOS Cocoa 应用程序。这是代码:

当连接到 UE BOOM 2 扬声器时无法播放,并出现以下错误:

这同样适用于 WONDERBOOM 扬声器和内置扬声器。

play如果我使用以下代码调用后台线程,我设法获得异常跟踪:

完整的输出是:

同样,如果使用 WONDERBOOM 或内置扬声器也没问题。

人们在这里也遇到了问题:https ://forums.developer.apple.com/thread/118459

AudioKit 也崩溃:AudioKit macOS HelloWorld 与 UE BOOM 2 扬声器崩溃

AVAudioPlayer对于我正在开发的应用程序来说是不够的。问题是什么?想必既然它抛出了一个异常,那就是Apple代码中的一个错误?

0 投票
1 回答
1141 浏览

ios - 如何为音频处理设置高优先级线程

我有使用 AVAudioEngine 播放音频的 iOS 应用程序。我将 AudioFile 中的帧读入 AVAudioPCMBuffer,然后将缓冲区发布到 AVAudioPlayerNode.scheduleBuffer。我在 DispatchQueue 上阅读了帧。我遇到的问题是,当应用程序有很多其他工作要做 - 与服务器同步和下载文件时,DispatchQueue 上的读取帧会延迟几秒钟执行,这会导致声音中断。我已将 DispatchQueueQos 设置为尽可能高的 .userInteractive,并且我在应用程序中没有其他具有相同 qos 的队列,但有时仍需要几秒钟才能在该队列上执行代码。

有什么解决办法吗?某种方式告诉操作系统这个队列是用于音频或类似的?

注意:如果应用程序运行一些繁重的后台操作,我对 AVPlayer 没有这个问题。

编辑:一些代码可以更好地理解。问题是有时需要几秒钟才能在队列上发布任务(从评论 1 到评论 2)。

谢谢

0 投票
1 回答
636 浏览

swift - 如何在 Swift 中使用 AVAudioEngine 和 AVAudioPlayerNode 播放音频?

我正在尝试使用 AVAudioEngine 和 AVAudioPlayerNode 播放音频。但是,在“engine.connect ...”中,我得到了这个:

“PlaySound[21867:535102] [AudioHAL_Client] AudioHardware.cpp:666:AudioObjectGetPropertyData: AudioObjectGetPropertyData: 没有给定 ID 0 的对象”

“engine.connect ...”之后的代码似乎在运行,因为它打印“buffer?.format”,但没有声音。

有人可以让我知道我错过了什么吗?这是我的测试代码。

在engine.connect() 中,我还尝试了engine.outputNode.outputFormat(forBus: 0) 而不是buffer?.format。我没有运气。

0 投票
1 回答
1491 浏览

ios - 如何使用连接到 AVAudioEngine 混音器的节点同时播放缓冲区中的多个声音

我正在为 iOS 制作一个基本的音乐应用程序,按下音符会播放相应的声音。我正在尝试将多个声音存储在缓冲区中,以便以最小的延迟同时播放。但是,我在任何时候都只能播放一种声音。

我最初使用多个 AVAudioPlayer 对象设置我的声音,为每个播放器分配一个声音。虽然它确实同时播放了多个声音,但它似乎无法同时启动两个声音(似乎它会在第一个声音开始后稍微延迟第二个声音)。此外,如果我以非常快的速度按下音符,引擎似乎跟不上,在我按下后面的音符后,后面的声音会很好地开始。

我正在尝试解决这个问题,从我所做的研究来看,使用 AVAudioEngine 播放声音似乎是最好的方法,我可以在缓冲区数组中设置声音,然后让它们播放从那些缓冲区。

每个声音都应该在不打断其他声音的情况下播放,只有在再次播放声音时才打断自己的声音。然而,尽管设置了多个缓冲区和播放器,并在 audioEngine 的混音器上将每个缓冲区和播放器分配给自己的总线,播放一个声音仍然会阻止任何其他声音的播放。

此外,虽然省略 .interrupts 确实会阻止声音停止其他声音,但这些声音在当前播放的声音完成之前不会播放。这意味着如果我播放note1,然后note2,然后note3,note1会播放,而note2只会在note1完成后播放,而note3只会在note2完成后播放。

编辑:我能够让 audioFilePlayer 再次重置到开头,而无需在 playSound 函数中使用以下代码中断。

这仍然让我弄清楚如何同时播放这些声音,因为播放另一个声音仍然会停止当前播放的声音。

编辑 2:我找到了解决问题的方法。我的答案如下。

0 投票
1 回答
692 浏览

loops - 如何在 Xcode10 中循环 AvAudioPlayerNode

嗨,我正在 SpriteKit 中制作 iOS 游戏,并决定使用 AvAudioPlayerNode 和引擎而不是常规 AvAudioPlayer,这样我可以更改音高和播放速度,但我遇到了 AvAudioPlayerNode 在播放后不重复的问题

我已经从堆栈溢出中使用了很多答案,但是如果你碰巧解决了这个问题,它们已经过时了,你能确保它与我的代码一起工作,否则它就没用了

//

'

//这只是通过这样做在游戏视图控制器中运行

我实际上不知道从哪里开始我对 Xcode 还很陌生,所以任何帮助都会很有用,请不要让我 15 岁的事情过于复杂

0 投票
2 回答
444 浏览

ios - iOS - AVAudioPlayerNode.play() 执行速度很慢

我在 iOS 游戏应用程序中使用 AVAudioEngine 音频。我遇到的一个问题是 AVAudioPlayerNode.play() 需要很长时间才能执行,这在游戏等实时应用程序中可能是一个问题。

play() 只是激活播放器节点 - 您不必每次播放声音时都调用它。因此,不必经常调用它,但必须偶尔调用它,例如最初激活播放器,或在它被停用后(在某些情况下会发生)。即使只是偶尔调用,较长的执行时间也可能是个问题,尤其是当您需要同时在多个播放器上调用 play() 时。

play() 的执行时间似乎与 AVAudioSession.ioBufferDuration 的值成正比,您可以使用 AVAudioSession.setPreferredIOBufferDuration() 请求更改该值。这是我用来测试的一些代码:

以下是我使用 1024 缓冲区大小(我相信这是默认值)获得的 play() 的一些示例计时:

以下是使用 256 缓冲区大小的一些示例时序:

正如您在上面看到的,对于 1024 的缓冲区大小,执行时间往往在 15-20 毫秒范围内(大约 60 FPS 的全帧)。缓冲区大小为 256 时,大约为 3 毫秒 - 没有那么糟糕,但当您每帧只有约 17 毫秒可以使用时仍然很昂贵。

这是在运行 iOS 12.4.2 的 iPad Mini 2 上。这显然是一个旧设备,但我在模拟器上看到的结果似乎是成比例的,所以它似乎更多地与缓冲区大小和函数本身的行为有关,而不是与所使用的硬件有关。我不知道幕后发生了什么,但似乎 play() 阻塞直到下一个音频周期的开始,或类似的东西。

请求较小的缓冲区大小似乎是部分解决方案,但也有一些潜在的缺点。根据此处的文档,从文件流式传输时,较低的缓冲区大小可能意味着更多的磁盘访问,不管怎样,请求可能根本不会被兑现。另外,在这里,有人报告了与低缓冲区大小相关的播放问题。考虑到所有这些,我不愿意将其作为解决方案。

这使我的 play() 执行时间在 15-20 毫秒范围内,这通常意味着 60 FPS 的帧丢失。如果我安排事情,以便一次只调用一次 play() 并且不频繁,也许它不会被注意到,但这并不理想。

我已经搜索了信息并在其他地方询问过这个问题,但似乎没有多少人在实践中遇到这种行为,或者这对他们来说不是问题。

AVAudioEngine 旨在用于实时应用程序,所以如果我是正确的 AVAudioPlayerNode.play() 阻塞了与缓冲区大小成比例的大量时间,这似乎是一个设计问题。我意识到这可能不是许多人正在处理的问题,但我在这里发帖询问是否有人遇到过 AVAudioEngine 的这个特定问题,如果是,是否有任何见解、建议或解决方法,任何人都可以提供。

0 投票
1 回答
262 浏览

avaudioengine - 淡出 AVAudioEngine AVAudioPlayerNode

我正在尝试使用 AVAudioEngine 和 AVAudioPlayerNode 淡出 mp3 文件。我想不明白。任何人都可以在 Swift 中提供帮助吗?

我已经尝试了一些东西。一切都很好,但没有我想要的那么顺利。

我还尝试了一个计时器(它不会褪色):

0 投票
1 回答
500 浏览

ios - 用户切换耳机时如何更改 AVAudioPlayerNode 格式

我需要播放基于输出设备的采样率生成的任意音调。用户需要连接有线或无线耳机才能收听音频。

由于现代耳机可以具有 44100 或 48000 的原生采样率,我需要以某种方式重新初始化我AVAudioPlayerNode的不同AVAudioFormat. 不做任何事情,音频开始听起来失真。但是,在尝试attach、或. 有时它会在我第一次尝试切换耳机时锁定执行(我同时连接了 2 个耳机,一个 SR 为 44100 的通用耳机和 SR 为 48000 的 Airpods),并且很少会在第二个时冻结尝试。detachconnectdisconnectNodeOutput

这是我的代码:

我已经尝试了许多“重新连接”的变体,AVAudioEngine但它们都陷入了以下僵局:

在此处输入图像描述

在此处输入图像描述

我也试过把它放在后台线程上,但这没关系。一旦应用程序尝试AVAudioEngine再次使用,一切都会卡住。

那么,是否有适当的方法重新连接AVAudioPlayerNode以更新采样率?或者也许可以不依赖耳机的原生采样率,而让音频正常地以静态采样率发声?提前致谢!

0 投票
1 回答
254 浏览

ios - AVAudioPlayerNode 同时播放多首歌曲

我正在尝试开发带有均衡器的音乐播放器应用程序。我正在使用AVAudioEngine并附加AVAudioPlayerNode,但是当我更改歌曲时,上一首歌曲也在播放当前歌曲。更改多首歌曲,同时播放所有歌曲。以前我使用MPMediaItemPlayer过,但在那种情况下,我无法连接均衡器。我希望我的应用使用均衡器一次播放一首歌曲。

提前致谢!

0 投票
1 回答
120 浏览

ios - 使用 AVAudioPlayer 在 iOS 中自动平移

我正在尝试使用 AVaudioPlayer 构建自动平移(在左、中、右声道之间移动音频)来播放我的音乐文件。我可以通过 AVAudioPlayer.pan 方法得到它。通过在我的 swift 代码中使用计时器来实现自动平移。现在的问题是,音频播放不流畅,并且介于两者之间。

这是我现在的代码,

我想将输出音频设为 MONO,并要求音频顺利播放 AUTOPANNED。