问题标签 [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.
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
的类型,并且是值,代表我的音频部分的开始/结束。AVAudioFile
URL
begin
end
TimeInterval
此外,将值framePosition(at:format:)
乘以传入TimeInterval
的采样率。AVAudioFormat
我为每个音频部分缓存此信息,但我在部分边界处听到咔嗒声,无论我是否提前安排它们。我也尝试在调度时不混合缓冲区和段,但我没有改变任何东西,所以我开始认为我在做错误的帧计算。
ios - 方法 PlayAtTime AVAudioPlayerNode IOS Xamarin 不起作用
我想在特定时间播放声音,我使用了方法PlayAtTime
,AVAudioPlayerNode
这是我的代码:
但代码不起作用。音频总是从头开始。
ios - 构建一个简单的均衡器
我想使用AVAudioEngine
. 我希望通过垂直滑块让用户输入每个频段的增益,并相应地调整正在播放的音频。我尝试过AVAudioUnitEQ
这样做,但在播放音频时我听不到任何区别。我试图硬编码值以指定每个频率的增益,但它仍然不起作用。这是我的代码:
由于低频的增益为 -10,而高频的增益为 10,因此在播放任何媒体时应该会有非常明显的差异。但是,当媒体开始播放时,听起来就像没有连接任何均衡器一样播放。
我不确定为什么会这样,但我尝试了几种不同的调试方法。我认为这可能是函数的顺序,所以我尝试切换它,以便在调整所有频段后调用 audioEngine.connect,但这也没有什么不同。
我使用 . 尝试了相同的代码AVAudioUnitTimePitch
,它运行良好,所以我对它为什么不能使用AVAudioUnitEQ
.
我不想为这个项目使用任何第三方库或可可豆荚,我想AVFoundation
单独使用。
任何帮助将不胜感激!
提前致谢。
swift - AVAudioPlayerNode 在播放时更改播放时间
我有滑块,点击手势,playerNODE
。当我触摸滑块上的某个位置时,我会通过点击手势获取滑块的位置。我想改变AVAudioPlayerNode
游戏时间。播放时间必须是滑块的位置。
ios - AVAudioPlayerNode scheduleBuffer interruptsAtLoop 正在立即中断
我有一个 AVAudioPlayerNode (playerNode) 和两个 AVAudioPCMBuffer (buffer1, buffer2) 设置。
我还有一个 10 秒的 AVAudioTime (futureTime) 设置。
上面等待10秒后播放buffer1并循环播放。
调用以下代码:
导致缓冲区 1 停止播放,缓冲区 2 立即启动,而不是等待至少 10 秒,然后在缓冲区 1 的下一个循环中中断。
任何想法我做错了什么导致这种立即中断而不是按照指示在循环中中断?
core-audio - 如何将 AVAudioPlayerNode 与 AVMutableComposition 一起使用
AVAudioEngine
和相关的AVAudioNode
对象似乎对音频处理非常强大,但很难看到如何使用它们自动更改参数。作为一个粗略的例子,我确信一定有比手动使用 aTimer
来更改值更有效的方法。
AVMutableAudioMixInputParameters
包括一个方法setVolumeRampFromStartVolume:toEndVolume:timeRange:
,但我看不到如何将其与AVAudioPlayerNode
(与 AVAudioEffectNodes 连接)集成并使用该方法随着时间的推移淡化音量。相反,我只看到了AVMutableAudioMixInputParameters
使用AVMutableComposition
实例的示例,并且没有一个包含AVAudioNode
对象。
任何人都可以发布或链接到一些代码示例,这些示例将 AVAudioNodes 的使用与setVolumeRampFromStartVolume:toEndVolume:timeRange:
或解释随着时间的推移在节点上自动更改参数的最佳实践?
非常感谢
ios - 如何使用 AVAudioEngine 取消或消除回声/重复声音?
我正在使用 AVAudioEngine 进行音频流传输。但是当我对着麦克风说任何单词时,它会重复多次,就像回声效果一样。我想当我说话的时候,声音只有一次,而不是多次。我想消除回声或额外的噪音。
我怎样才能做到这一点?
swift - 如何使用 AVAudioPlayerNode 从资产目录播放声音?
我正在尝试使用 anAVAudioPlayerNode
来播放Assets.xcassets
资产目录中的声音,但我不知道该怎么做。
我一直在使用AVAudioPlayer
,可以这样初始化NSDataAsset
:
我想使用 anAVAudioPlayerNode
代替(出于音高转换和其他原因)。我可以创建引擎并连接节点 OK:
看起来用于播放文件的方法是playerNode.scheduleFile()
. 它需要一个AVAudioFile
,所以我想我会尝试做一个。但是初始化器需要AVAudioFile
一个 URL。据我所知,资产目录中的资产不能通过 URL 获得。我可以直接使用 获取数据NSDataAsset
,但似乎没有任何方法可以使用它来填充AVAudioFile
.
是否可以使用 播放资产目录中的声音AVAudioPlayerNode
?如果是这样,怎么办?
swift - 多声道播放多个WAV AVAudioEngine
我有 15 个 WAV 文件,需要在各个频道上按顺序播放。我开始尝试让两个文件使用左/右立体声分离。
我正在创建一个音频引擎、一个混音器和两个 AVAudioPlayerNode。音频文件是单声道的,我试图让 PlayerA 的文件从左声道输出,而从 PlayerB 的文件从右声道输出。我无法理解的是 AudioUnitSetProperty 的工作原理。它似乎只与一个文件有关,而且每个音频单元似乎只能有一个?我想知道是否有一种方法可以将文件与 audioUnit 相关联?我似乎无法返回与每个轨道关联的 audioUnit 对象。
ios - 如何多次将 AVAudioFile 读入同一个 AVAudioPCMBuffer?
编辑:
通过在我的 for 循环末尾添加,我能够防止readIntoBuffer返回 false 。audioFileB.framePosition = 0;
但是,现在看起来 bufferB 仅包含来自最终readIntoBuffer调用的音频(我的不完整循环)。有谁知道为什么我的缓冲区在每次 readIntoBuffer 调用后丢弃以前加载到其中的数据?
原始问题:
我有两个 AVAudioFile,audioFileA和audioFileB,其中 A 的持续时间比 B 长(可能是好几倍)。我想创建两个足够大的 AVAudioPCMBuffers 来保存 audioFileA,用 audioFileA 的数据填充其中一个,并一遍又一遍地用 audioFileB 的数据填充另一个,直到缓冲区已满。换句话说,第二个缓冲区应该包含 audioFileB 中音频的“循环”。这是我的尝试:
问题是[audioFileB readIntoBuffer:bufferB frameCount:(AVAudioFrameCount)audioFileB.length error:&bufferBError]
当它被多次调用时返回 false 。关于我如何做到这一点的任何想法?