gpt4 book ai didi

ios - AVAudioEngine:一次启动一组 AVAudioPlayerNode

转载 作者:塔克拉玛干 更新时间:2023-11-01 21:20:57 25 4
gpt4 key购买 nike

我正在开发一个同时启动多个循环并应保持同步的应用。

使用以前的天真方法解决问题(不使用 AVAudioEngine),我发现以编程方式依次启动多个音频播放器会在调用之间产生足够的延迟,从而使结果变得无用;节拍听起来不同步。

我可以使用 AVAudioEngine 实现这种功能吗?

目前我正在将 AVAudioPlayerNodes 连接到混音器,并且我已经将缓冲区附加到它们并控制来自那里的输入。但是我可以让它们全部同时启动吗?

似乎在我调用播放之前节点不会开始产生声音,而这在引擎启动之前无法完成...

最佳答案

要获得更深入的解释,请查看我在

中的回答

AVAudioEngine multiple AVAudioInputNodes do not play in perfect sync


简而言之:

如果您的引擎已经在运行,您在 AVAudioNode 中获得了一个 @property lastRenderTime - 您的播放器的父类(super class) - 这是您实现 100% 采样帧准确同步的门票。 .

AVAudioFormat *outputFormat = [playerA outputFormatForBus:0];

const float kStartDelayTime = 0.0; // seconds - in case you wanna delay the start

AVAudioFramePosition startSampleTime = playerA.lastRenderTime.sampleTime;

AVAudioTime *startTime = [AVAudioTime timeWithSampleTime:(startSampleTime + (kStartDelayTime * outputFormat.sampleRate)) atRate:outputFormat.sampleRate];

[playerA playAtTime: startTime];
[playerB playAtTime: startTime];
[playerC playAtTime: startTime];
[playerD playAtTime: startTime];

[player...

顺便说一句 - 您可以使用 AVAudioPlayer 类实现相同的 100% 采样帧准确结果...

NSTimeInterval startDelayTime = 0.0; // seconds - in case you wanna delay the start
NSTimeInterval now = playerA.deviceCurrentTime;

NSTimeIntervall startTime = now + startDelayTime;

[playerA playAtTime: startTime];
[playerB playAtTime: startTime];
[playerC playAtTime: startTime];
[playerD playAtTime: startTime];

[player...

在没有 startDelayTime 的情况下,所有玩家的前 100-200 毫秒将被剪掉,因为开始命令实际上需要时间到运行循环,尽管玩家已经开始(好吧,已安排)100% 同步在 现在。但是有了 startDelayTime = 0.25 就可以了。并且永远不要忘记提前prepareToPlay你的玩家,这样在开始时就不需要额外的缓冲或设置 - 只是让他们开始;-)

关于ios - AVAudioEngine:一次启动一组 AVAudioPlayerNode,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35912061/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com