问题标签 [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 投票
1 回答
59 浏览

audiokit - 在用户指定的时间从AKPlayer获取回调

我试图在 AKPlayer 的文件播放中的给定点获得回调(当前,就在结束之前)。我在 上看到了 Apple 文档addBoundaryTimeObserver(),它可以工作,但似乎无法从 AKPlayer 访问(我猜是 AVAudioPlayerNode 与 AVPlayer 的事情)。有什么建议么?我在 AVAudioPlayerNode 中看到了一些回调......也许我可以根据所需的时间和使用来确定缓冲区dataConsumed

目标是在文件播放完毕之前触发另一个事件(完成时有一个回调,但显然为时已晚)。

如果有人做过类似的事情,或者知道类似的事情(要点等),那就太好了。

0 投票
2 回答
361 浏览

avfoundation - AVAudioEngine:播放 Int16 PCM 样本流

我正在接收作为 Int16s 的 16 位/48 kHz 立体声 PCM 样本流,我正在尝试使用 AVAudioEngine 播放它们,但是我什么也没听到。我认为这要么与我设置播放器的方式有关,要么与我将数据推送到缓冲区的方式有关。

我已经阅读了很多关于使用音频队列服务的替代解决方案的信息,但是我能找到的所有示例代码都在 Objective-C 或 iOS-only 中。

如果我有任何类型的 frameSize 问题或其他任何问题,我不应该至少还能听到扬声器发出的垃圾吗?

这是我的代码:

任何帮助将不胜感激。

0 投票
1 回答
145 浏览

ios - Swift - 如何在循环时获取 AVAudioPlayerNode 的当前位置?

我有一个AVAudioPlayerNode循环的歌曲片段:

我想在播放时获取歌曲的当前位置。通常,这是通过计算 =currentFrame / audioSampleRate

在哪里

但是,当循环结束并重新启动时,currentFrame不会重新启动。但它仍然会增加,这使得currentFrame / audioSampleRate当前位置不正确。

那么计算当前位置的正确方法是什么?

0 投票
0 回答
42 浏览

ios - AVAudioPlayerNode - 播放状态和开始/结束通知

我有一个AVAudioPlayerNodeAVAudioEngine. 我使用 schedule 方法将它们加载到队列中。我如何知道播放的状态以及单个文件何时开始和结束播放?

这是我用于调度的代码:

0 投票
2 回答
249 浏览

swift - 计时问题:节拍器使用 AVAudioEngine scheduleBuffer 的完成处理程序

我想使用具有以下功能的 AVAudioEngine 构建一个简单的节拍器应用程序:

  • 可靠的时机(我知道,我知道,我应该使用音频单元,但我仍在为核心音频的东西/Obj-C 包装器等而苦苦挣扎)
  • 小节的“1”和节拍“2”/“3”/“4”上有两种不同的声音。
  • 某种需要与音频同步的视觉反馈(至少是当前节拍的显示)。

所以我创建了两个短点击声音(26ms / 1150 个样本 @ 16 位 / 44,1 kHz / 立体声 wav 文件)并将它们加载到 2 个缓冲区中。它们的长度将设置为代表一个时期。

我的 UI 设置很简单:一个切换开始/暂停的按钮和一个显示当前节拍的标签(我的“计数器”变量)。

当使用 scheduleBuffer 的循环属性时,时间是可以的,但是因为我需要有 2 种不同的声音和一种在循环点击时同步/更新我的 UI 的方法,所以我不能使用它。我想出使用 completionHandler 来代替它重新启动我的 playClickLoop() 函数 - 请参阅下面附上的我的代码。

不幸的是,在实现这一点时,我并没有真正测量时间的准确性。事实证明,将 bpm 设置为 120 时,它仅以大约 117.5 bpm 的速度播放循环 - 相当稳定但仍然太慢。当 bpm 设置为 180 时,我的应用程序以大约 172.3 bpm 的速度播放。

这里发生了什么?这种延迟是通过使用 completionHandler 引入的吗?有什么办法可以改善时间吗?还是我的整个方法都错了?

提前致谢!亚历克斯

0 投票
0 回答
103 浏览

swift - Swift:如何将 AVAudioEngine 的立体声输出转换为单声道

我正在尝试将我的 AVAudioEngine 的输出从立体声转换为单声道。我希望能够使用 AVAudioPlayerNode 的 pan 属性将转换后的单声道信号发送到左右耳机或扬声器。

有没有办法将引擎的输出(AVAudioEngine -> engine.mainMixerNode)实时转换为单声道信号?

0 投票
1 回答
191 浏览

ios - Swift:使用 AVAudioEngine (AVAudioPlayerNode) 播放无缝音频?

基本上,我正在尝试通过 websockets(我正在使用 StarScream)使用 AudioEngine 播放 AAC(带有 ADTS 标头)流。我实时播放这些音频,播放时音频包之间存在故障。这些是我尝试过的步骤:

  1. 从 WebSocket 接收数据
  1. 解析 AAC(AAC 到 PCM)

使用 FileHandle 将数据保存到 audio.aac 并使用 AVAudioFile 对其进行解码

  1. 播放 PCM 数据
  1. 最终结果音频在每个音频数据包之间存在一些故障。问题与此类似。 https://storage.googleapis.com/webfundamentals-assets/videos/gap.webm

对我做错的任何建议表示赞赏。

谢谢!

0 投票
0 回答
29 浏览

ios - 使用 AVAudioEngine 从外部 MIDI 垫播放声音

我正在用 Objective-C 开发一个应用程序,在该应用程序中,当用户敲击他的乐器的一个打击垫(有几个打击垫)时,我必须在给定的时刻播放样本(1 秒)。通过 MIDI 接口,我接收到音符并重现它们,我执行以下操作:

以前我有一个AVAudioEngine实例化,并且在它的混音器节点(AVAudioMixerNode)中我附加了 16 个AVAudioPlayerNode

我有一个指向当前 AVAudioPlayerNode 的整数(iCurrentNode 范围从 0 到 15)。当用户点击垫子时,我会:

16 个播放节点的原因是 scheduleFile 不允许重叠声音。因此,如果用户在第一个声音完成播放之前敲击一个打击垫并再次敲击它,那将是排队而不是重叠。

我已经简化了代码,因为我还根据通过 MIDI 接口传给我的“速度”为播放节点分配音量。

实施效果很好,但我想知道我是否设计了最佳解决方案。例如,我不知道是否应该使用AVAudioUnitSampler而不是AVAudioPlayerNode

非常感谢!

0 投票
1 回答
69 浏览

avfoundation - 为什么我不能在 Mac Catalyst 上创建 AVAudioFile?(错误-54)

我的应用程序允许用户从他们的 iTunes 媒体库中选择一个录音,然后保存媒体 ID 以供以后播放。从媒体 ID,我可以MPMediaQuery用来获取MPMediaItem,然后获取录制 URL:

从 URL 中,我创建了一个AVAudioFile我可以提供给一个AVAudioPlayerNode以供播放的:

这一切都在 iOS 上运行良好。在 Mac Catalyst 上,我可以获得一个有效的 URL(在调试器中检查它时我可以看到它是正确的),但该AVAudioFile:forReading函数会引发此错误:

我检查了 Mac 设置应用程序中的隐私设置,我的应用程序有权访问音乐库。我还能检查什么?错误 -54 是什么意思?Mac Catalyst 应用程序是否支持此功能?

我在 macOS 11.4 上使用 Xcode 12.5.1。

0 投票
0 回答
21 浏览

ios - 避免延迟播放来自其他应用程序的音乐的音频(Soundcloud)

所以当我写这篇文章时,我意识到这个问题有多具体......

我正在制作一个 iOS 应用程序,它可以在其他应用程序的音乐上播放声音,但是对于某些应用程序(到目前为止,实际上只有一个),我在播放该应用程序不播放时不会出现的声音时遇到了延迟它的音乐,即

  1. 使用Soundcloud应用程序开始播放
  2. 加载我的应用
  3. 按下按钮播放声音
  4. 声音播放

如果我省略第 1 步(或使用不同的应用程序,见下文),则 3 和 4 之间没有(可感知的)延迟,但将第 1 步保持在那里,我会在播放开始时听到一小段(~200 毫秒)延迟。

我尝试过AVAudioPlayer使用[player prepareToPlay]

AVAudioPlayerNode//使用AVAudioEngineAVAudioMixerNode

...但无论如何我都看到了同样的延迟。

使用音乐 (iTunes) 应用程序或 Spotify 播放音乐时不会发生这种延迟,所以我猜这是 SoundCloud 应用程序特别在做的事情,但我想知道是否有办法绕过它。

我真的希望这里有人遇到类似的问题并解决了它 - 我无法从我的谷歌搜索中找到任何东西......