小编scg*_*scg的帖子

iOS - AVAudioPlayerNode.play() 执行速度非常慢

我在 iOS 游戏应用程序中使用 AVAudioEngine 来处理音频。我遇到的一个问题是 AVAudioPlayerNode.play() 需要很长时间才能执行,这在游戏等实时应用程序中可能会出现问题。

play() 只是激活播放器节点 - 您不必每次播放声音时都调用它。因此,不必经常调用它,但必须偶尔调用它,例如最初激活播放器,或在停用播放器后(在某些情况下会发生这种情况)。即使只是偶尔调用,较长的执行时间也可能是一个问题,特别是当您需要同时对多个玩家调用 play() 时。

play() 的执行时间似乎与 AVAudioSession.ioBufferDuration 的值成正比,您可以使用 AVAudioSession.setPreferredIOBufferDuration() 请求更改该值。这是我用来测试这个的一些代码:

import AVFoundation
import UIKit

class ViewController: UIViewController {
    private let engine = AVAudioEngine()
    private let player = AVAudioPlayerNode()
    private let ioBufferSize = 1024.0 // Or 256.0

    override func viewDidLoad() {
        super.viewDidLoad()

        let audioSession = AVAudioSession.sharedInstance()

        try! audioSession.setPreferredIOBufferDuration(ioBufferSize / 44100.0)
        try! audioSession.setActive(true)

        engine.attach(player)
        engine.connect(player, to: engine.mainMixerNode, format: nil)

        try! engine.start()

        print("IO buffer duration: \(audioSession.ioBufferDuration)")
    }

    override func touchesBegan(_ touches: Set<UITouch>, with event: …
Run Code Online (Sandbox Code Playgroud)

ios avaudioengine avaudioplayernode

3
推荐指数
1
解决办法
964
查看次数

标签 统计

avaudioengine ×1

avaudioplayernode ×1

ios ×1