问题标签 [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 回答
593 浏览

ios - 从某个时间开始将 AVAudioFile 读入缓冲区

假设我有一个持续时间为 10 秒的 AVAudioFile。我想将该文件加载到 AVAudioPCMBuffer 中,但我只想加载在特定秒数/毫秒数或特定 AVAudioFramePosition 之后出现的音频帧。

看起来 AVAudioFile 的readIntoBuffer方法没有给我那种精度,所以我假设我必须在 AVAudioBuffer 级别或更低级别工作?

0 投票
1 回答
973 浏览

ios - 有没有办法使用 AVAudioPlayerNode 从头开始​​重播声音?

我设置了一堆音频节点

有没有办法让我从头开始重播存储在 AVAudioPlayerNode 中的音频文件?目前,当我按下 IBAction 时,声音会播放,但我无法重播。我正在尝试做相当于 AVAudioPlayer.starttime = 0

0 投票
1 回答
1275 浏览

ios11 - iOS11 中的 AVAudioPlayerNode 预定缓冲区和音频路由变化

我看到 iOS 9/10 和 iOS 11 之间的缓冲区行为不同,当音频路由发生更改时(例如,您插入耳机),这些缓冲区将在 AVAudioPlayerNode 上调度。有没有人经历过类似的事情,你是如何解决的?请注意,我大约两周前在 Apple 的 AVFoundation 支持论坛上报告了这个问题,并且收到的回复完全为零。

显示此问题的代码如下所示 - 首先简要说明:该代码是一个简单的循环,它重复调度缓冲区在将来的某个时间播放。该过程通过调用“runSequence”方法开始,该方法安排音频缓冲区在将来的某个时间播放,并将完成回调设置为嵌套方法“audioCompleteHandler”。完成回调再次调用“runSequence”方法,该方法调度另一个缓冲区并保持进程永远进行。在这种情况下,除非完成处理程序正在执行,否则总是会安排一个缓冲区。各个地方的'trace'方法是内部方法,仅在调试时打印,所以可以忽略。

在音频路由更改通知处理程序 (handleAudioRouteChange) 中,当新设备可用时(案例 .newDeviceAvailable),代码会重新启动引擎和播放器,重新激活音频会话并调用“runSequence”以使循环恢复正常。

这一切在 iOS 9.3.5 (iPhone 5C) 和 iOS 10.3.3 (iPhone 6) 上运行良好,但在 iOS 11.1.1 (iPad Air) 上失败。失败的本质是 AVAudioPlayerNode 不播放音频,而是立即调用完成处理程序。这会导致失控的情况。如果我再次删除启动循环的行(如代码中所示),它在 iOS 11.1.1 上运行良好,但在 iOS 9.3.5 和 iOS 10.3.3 上失败。这个失败是不同的:音频刚刚停止,在调试器中,我可以看到循环没有循环。

因此,一种可能的解释是,在 iOS 9.x 和 iOS 10.x 下,未来计划的缓冲区在发生音频路由更改时是非计划的,而在 iOS 11.x 下,未来计划的缓冲区不是计划外的。

这导致了两个问题: 1. 有没有人看到任何类似的行为?解决方法是什么?2. 当音频路由改变(或音频中断)发生时,谁能指出描述引擎、播放器和会话的确切状态的文档?

0 投票
1 回答
4385 浏览

ios - 播放 AVAudioPlayerNode 时 AVAudioEngine inputNode 的格式发生变化

我将从一个简单的“操场”视图控制器类开始,它演示了我的问题:

上面的 VC 有一个 AVAudioEngine 实例和两个 UIButton 动作:一个播放在硬编码 url 中找到的音频文件,另一个在引擎的inputNode上切换安装/删除。

我的目标是让实时麦克风窃听和音频文件播放同时工作,但完全相互排斥。也就是说,无论我的麦克风水龙头的当前状态如何,我都希望能够触发播放,反之亦然。如果我在触发音频文件播放之前安装水龙头,一切都会按预期工作。但是,如果我先播放音频文件,然后尝试安装水龙头,则会出现以下崩溃:

这导致我通过installTap调用上方的日志语句检查麦克风格式的数据。果然,当我在播放前安装分接头时,我得到预期的采样率 44100.0 和通道数 1。但是当我先播放音频文件然后安装麦克风分接头时,我的日志显示采样率为 0 和一个通道计数 2 这给了我上面显示的错误。

我尝试修改 AVAudioEngine 的启动/重置流程,尝试了我的 AVAudioSession 的不同类别/模式组合(请参阅我的configureAudioSession方法),并尝试手动创建点击格式,如下所示:

这给了我一个类似但不同的错误:

我看不出麦克风的格式数据会因是否播放了 AVAudioPlayerNode 而有所不同的任何原因。

0 投票
1 回答
929 浏览

audio - 如何将声音播放到 USB 音频接口上的特定输出通道?

我有一个 motu UltraLite mk4 USB 音频接口连接到运行 MacOS 10.13.3 的 Mac。

我正在尝试播放三个立体声文件,每个文件都有自己的立体声扬声器。

为了降低复杂性,我只是试图让一个 AVAudioPlayerNode 的立体声从默认输出通道 0 和 1 以外的其他东西中发出。

USB音频接口正面

USB音频接口背面

我希望通过 AVAudioEngine + 一些低级核心音频来实现这一点。

到目前为止,通过配置 AVAudioEngine 的输出节点,我已经成功地将音频播放到我的 USB 音频接口:

我还成功地设置了一个通道映射,它允许一个播放器将立体声文件播放到我的 USB 音频接口的通道 4+5,正如 theanalogkid 在 Apple 开发论坛中所描述的那样

通道映射的问题在于它被全局应用于 AVAudioEngine 的输出,并且它会影响所有 AVAudioPlayerNode。所以这不是解决方案。

因此,我没有在 AVAudioEngine 的 outputNode 的 AudioUnit 上使用该通道映射,而是尝试使用自定义通道布局创建一个 AVAudioFormat,该布局指定离散通道索引 4 和 5:

然后我将播放器的混音器连接到引擎的主混音器,使用输出硬件格式:

以及播放器到它的混音器,使用带有调整通道布局的自定义 AVAudioFormat:

结果?声音播放,但仍只出 USB 音频接口默认的 0 和 1 声道。

如果我将 targetFormat 应用于混音器到 mainMixer 的连接,USB 音频接口根本不会收到任何声音。

我还尝试将通道映射应用于 AVAudioMixerNode 的底层 AVAudioUnit,但是我似乎无法从 AVAudioUnit 获取底层裸机 AudioUnit 以应用通道映射。也许这对于 AVAudioEngine 是不可能的。如果是这样,您是否知道任何其他方法可以做到这一点?

可能我忽略了一些关键的东西。我花了很多天研究这个,感觉卡住了。感谢我能得到的任何帮助。

0 投票
1 回答
662 浏览

ios - 在 iOS 中使用多个播放按钮播放声音

我必须一次播放三种类型的 wav 文件。当我单击 Enter 区域中的 Play 按钮时,它会播放一个名为“EnterRegion.wav”的声音,然后单击 Exit Region 播放按钮会播放“ExitRegion.wav”音频文件。

但是对于立即的播放按钮,它会重复播放声音,直到我按下停止按钮。

第一个和第二个播放按钮对我来说都很完美,但是当我点击立即播放按钮时,它会第一次播放声音,但是当我点击其他播放按钮并再次返回立即播放按钮时,应用程序会抛出异常。当我按下停止按钮并返回立即部分的播放按钮时,也会发生这种情况。我在 Swift 4 中的示例应用程序屏幕截图和代码示例如下。

在此处输入图像描述

}

我无法找到发生这种情况的原因,请您帮我解决问题或提供任何建议。

0 投票
1 回答
695 浏览

ios - 声音仅在 iOS 中使用 AVAudioEngine 首次播放

我有一个声音文件,它听成哔哔声,我必须反复播放这个声音,并根据某些条件改变它的音高。我正在使用 AVAudioEngine、AVAudioPlayerNode 和 AVAudioUnitTimePitch 来实现这个目标。我认为有两个按钮,即PlayStop。当我第一次按下播放按钮时,声音在重复播放,但是在单击停止按钮一次然后再次单击播放按钮后,声音没有播放并且也没有错误。我一直在研究这个问题很长时间,但无法得到解决方案,所以我来到了这里。你能帮我解决这个问题吗?或者我的问题还有其他替代解决方案吗?我的代码如下:

0 投票
1 回答
159 浏览

ios - 在 iOS 的 AVAudioPlayerNode 中播放特定次数的声音

有一个选项numberofloopsAVAudioPlayer其中重复声音文件指定的次数。

我必须在其中实现这种类型的函数,AVAudioPlayerNode并且我找到了一个选项,可以使用以下代码在循环中无限次循环声音文件

audioPlayerNode.scheduleBuffer(audioFileBuffer,atTime:无,选项:.Loops,completionHandler:无)

是否可以像 as 一样以固定次数重复播放文件AVAudioPlayer?是否有任何代码示例可以实现这一目标?

0 投票
0 回答
192 浏览

objective-c - AVAudioPlayerNode 获取当前时间不正确

我使用此代码获取 AVAudioPlayerNode 的当前时间,

但是,当我通过 a 调用此代码时CADisplayLinkplayerTime.sampleTime返回-512-1024第一次。

不知道对不对?

还是有其他方法可以AVAudioPlayerNode实时获取 的当前时间?

0 投票
1 回答
299 浏览

swift - AVAudoPlayerNode 播放声音定义的次数

是否可以在 AVAudioPlayerNode 中循环播放音频声音多次而不是无限次?下面的代码将音频安排为无限次,而不是说 5 次。

我看起来类似于 AVAudioPlayer 的numberOfLoops来定义播放音频的次数。我可以使用 AVAudioPlayer 但没有播放音频音高的功能。