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

ios - AVAudioPlayerNode - 在调度缓冲区和段之间混合

我正在编写一个应用程序,我应该在其中播放部分音频文件。每个音频文件都包含一个单独轨道的音频数据。这些部分是有开始时间和结束时间的部分,我正在尝试按照我选择的顺序播放这些部分。

例如,假设我有 4 个部分:

A B C D

然后我激活B和D,我想玩,B,然后D,然后再B,然后D,等等。

为了在播放中平滑“跳跃”,我认为淡入/淡出开始/结束部分缓冲区很重要。

所以,我有一个基本的AVAudioEngine设置,带有AVAudioPlayerNode, 和一个混音器。对于每个音频部分,我缓存了一些信息:

  • 该部分中第一个样本的缓冲区(我手动淡入)
  • AVAudioFramePosition, 和AVAudioFrameCount中间段的元组
  • 音频部分中结束样本的缓冲区(我手动淡出)

现在,当我安排播放部分时,我会说AVAudioPlayerNode

  • 安排启动缓冲区(scheduleBuffer(_:completionHandler:)无选项)
  • 安排中间段 ( scheduleSegment(_:startingFrame:frameCount:at:completionHandler:))
  • 最后安排结束缓冲区(scheduleBuffer(_:completionHandler:)无选项)

都在“时间” nil

这里的问题是我可以在音频部分边界听到 clic 和蹩脚的声音,我看不出我做错了什么。我的第一个想法是我手动进行的淡入淡出(基本上是将样本值乘以音量因子),但不这样做的结果相同。我以为我没有及时安排,但提前安排部分,例如事先 A - B - C 有相同的结果。然后我尝试了不同的帧位置计算,使用音频格式设置,结果相同。

所以我在这里没有想法,也许我没有得到正确的时间表机制。

任何人都可以确认我可以混合调度缓冲区和段AVAudioPlayerNode吗?还是我应该只安排缓冲区或段?我可以确认只安排分段有效,播放非常好。

关于我如何缓存音频部分信息的一点上下文。在下面的代码中,是从 a 加载到磁盘上file的类型,并且是值,代表我的音频部分的开始/结束。AVAudioFileURLbeginendTimeInterval

此外,将值framePosition(at:format:)乘以传入TimeInterval的采样率。AVAudioFormat

我为每个音频部分缓存此信息,但我在部分边界处听到咔嗒声,无论我是否提前安排它们。我也尝试在调度时不混合缓冲区和段,但我没有改变任何东西,所以我开始认为我在做错误的帧计算。

0 投票
1 回答
231 浏览

ios - 方法 PlayAtTime AVAudioPlayerNode IOS Xamarin 不起作用

我想在特定时间播放声音,我使用了方法PlayAtTimeAVAudioPlayerNode 这是我的代码:

但代码不起作用。音频总是从头开始。

0 投票
1 回答
5075 浏览

ios - 构建一个简单的均衡器

我想使用AVAudioEngine. 我希望通过垂直滑块让用户输入每个频段的增益,并相应地调整正在播放的音频。我尝试过AVAudioUnitEQ这样做,但在播放音频时我听不到任何区别。我试图硬编码值以指定每个频率的增益,但它仍然不起作用。这是我的代码:

由于低频的增益为 -10,而高频的增益为 10,因此在播放任何媒体时应该会有非常明显的差异。但是,当媒体开始播放时,听起来就像没有连接任何均衡器一样播放。

我不确定为什么会这样,但我尝试了几种不同的调试方法。我认为这可能是函数的顺序,所以我尝试切换它,以便在调整所有频段后调用 audioEngine.connect,但这也没有什么不同。

我使用 . 尝试了相同的代码AVAudioUnitTimePitch,它运行良好,所以我对它为什么不能使用AVAudioUnitEQ.

我不想为这个项目使用任何第三方库或可可豆荚,我想AVFoundation单独使用。

任何帮助将不胜感激!

提前致谢。

0 投票
0 回答
632 浏览

swift - AVAudioPlayerNode 在播放时更改播放时间

我有滑块,点击手势,playerNODE。当我触摸滑块上的某个位置时,我会通过点击手势获取滑块的位置。我想改变AVAudioPlayerNode游戏时间。播放时间必须是滑块的位置。

0 投票
1 回答
551 浏览

ios - AVAudioPlayerNode scheduleBuffer interruptsAtLoop 正在立即中断

我有一个 AVAudioPlayerNode (playerNode) 和两个 AVAudioPCMBuffer (buffer1, buffer2) 设置。

我还有一个 10 秒的 AVAudioTime (futureTime) 设置。

上面等待10秒后播放buffer1并循环播放。

调用以下代码:

导致缓冲区 1 停止播放,缓冲区 2 立即启动,而不是等待至少 10 秒,然后在缓冲区 1 的下一个循环中中断。

任何想法我做错了什么导致这种立即中断而不是按照指示在循环中中断?

0 投票
1 回答
364 浏览

core-audio - 如何将 AVAudioPlayerNode 与 AVMutableComposition 一起使用

AVAudioEngine和相关的AVAudioNode对象似乎对音频处理非常强大,但很难看到如何使用它们自动更改参数。作为一个粗略的例子,我确信一定有比手动使用 aTimer来更改值更有效的方法。

AVMutableAudioMixInputParameters包括一个方法setVolumeRampFromStartVolume:toEndVolume:timeRange:,但我看不到如何将其与AVAudioPlayerNode(与 AVAudioEffectNodes 连接)集成并使用该方法随着时间的推移淡化音量。相反,我只看到了AVMutableAudioMixInputParameters使用AVMutableComposition实例的示例,并且没有一个包含AVAudioNode对象。

任何人都可以发布或链接到一些代码示例,这些示例将 AVAudioNodes 的使用与setVolumeRampFromStartVolume:toEndVolume:timeRange:或解释随着时间的推移在节点上自动更改参数的最佳实践?

非常感谢

0 投票
1 回答
1536 浏览

ios - 如何使用 AVAudioEngine 取消或消除回声/重复声音?

我正在使用 AVAudioEngine 进行音频流传输。但是当我对着麦克风说任何单词时,它会重复多次,就像回声效果一样。我想当我说话的时候,声音只有一次,而不是多次。我想消除回声或额外的噪音。

我怎样才能做到这一点?

0 投票
1 回答
1408 浏览

swift - 如何使用 AVAudioPlayerNode 从资产目录播放声音?

我正在尝试使用 anAVAudioPlayerNode来播放Assets.xcassets资产目录中的声音,但我不知道该怎么做。

我一直在使用AVAudioPlayer,可以这样初始化NSDataAsset

我想使用 anAVAudioPlayerNode代替(出于音高转换和其他原因)。我可以创建引擎并连接节点 OK:

看起来用于播放文件的方法是playerNode.scheduleFile(). 它需要一个AVAudioFile,所以我想我会尝试做一个。但是初始化器需要AVAudioFile一个 URL。据我所知,资产目录中的资产不能通过 URL 获得。我可以直接使用 获取数据NSDataAsset,但似乎没有任何方法可以使用它来填充AVAudioFile.

是否可以使用 播放资产目录中的声音AVAudioPlayerNode?如果是这样,怎么办?

0 投票
1 回答
901 浏览

swift - 多声道播放多个WAV AVAudioEngine

我有 15 个 WAV 文件,需要在各个频道上按顺序播放。我开始尝试让两个文件使用左/右立体声分离。

我正在创建一个音频引擎、一个混音器和两个 AVAudioPlayerNode。音频文件是单声道的,我试图让 PlayerA 的文件从左声道输出,而从 PlayerB 的文件从右声道输出。我无法理解的是 AudioUnitSetProperty 的工作原理。它似乎只与一个文件有关,而且每个音频单元似乎只能有一个?我想知道是否有一种方法可以将文件与 audioUnit 相关联?我似乎无法返回与每个轨道关联的 audioUnit 对象。

0 投票
0 回答
707 浏览

ios - 如何多次将 AVAudioFile 读入同一个 AVAudioPCMBuffer?

编辑:

通过在我的 for 循环末尾添加,我能够防止readIntoBuffer返回 false 。audioFileB.framePosition = 0;但是,现在看起来 bufferB 仅包含来自最终readIntoBuffer调用的音频(我的不完整循环)。有谁知道为什么我的缓冲区在每次 readIntoBuffer 调用后丢弃以前加载到其中的数据?

原始问题:

我有两个 AVAudioFile,audioFileAaudioFileB,其中 A 的持续时间比 B 长(可能是好几倍)。我想创建两个足够大的 AVAudioPCMBuffers 来保存 audioFileA,用 audioFileA 的数据填充其中一个,并一遍又一遍地用 audioFileB 的数据填充另一个,直到缓冲区已满。换句话说,第二个缓冲区应该包含 audioFileB 中音频的“循环”。这是我的尝试:

问题是[audioFileB readIntoBuffer:bufferB frameCount:(AVAudioFrameCount)audioFileB.length error:&bufferBError]当它被多次调用时返回 false 。关于我如何做到这一点的任何想法?