gpt4 book ai didi

ios - AudioKit AKPlayer 无法环回以 setPosition 开头

转载 作者:行者123 更新时间:2023-12-04 07:53:51 26 4
gpt4 key购买 nike

在 v4 中,如果您使用 AKPlayer带循环和使用 setPosition API,播放器在 setPosition 设置的位置之间循环和球员的总持续时间。我需要的是从setPosition设置的位置开始API 并在循环发生时循环到开头。我不确定这是否是故意的,但我需要能够在播放器中寻找某个点并循环到开头,现在看来这不是 AudioKit 中的功能。
有没有办法或解决方法来实现这一目标?我需要将其作为一项要求来完成。
在这里重现是一个完整的操场示例:

import AudioKitPlaygrounds
import AudioKit

let file = try AKAudioFile(readFileName: "3.aac")

//: Set up a player to the loop the file's playback
var player = AKPlayer(audioFile: file)
player.isLooping = true
player.buffering = .always

AKManager.output = player
try AKManager.start()


player.setPosition(player.duration - 2)
player.play(at: AVAudioTime.now())
// player loops between player.duration - 2, player.duration forever. I want it to loop between 0, player.duration

import PlaygroundSupport
PlaygroundPage.current.needsIndefiniteExecution = true
预期行为
我预计它会循环回到开头。
细节:
  • AudioKit 版本 4.11.2
  • 最佳答案

    如果您打算开发某种循环播放器应用程序,我认为该方法是使用音序器来协调音频文件的播放。在应该开始播放声音的每个位置,向序列添加一个事件。
    音序器可以连接到回调工具,这是一个将事件传递给用户定义函数的节点。在您的回调函数中,您将开始播放由该事件指示的音频文件。
    这是应该做的事情的概述:

  • 使用 AKSequencer 创建一个包含播放事件的轨道的 addTrack方法。将此轨道连接到 AKCallbackInstrument .请查看 this answer关于如何将 AKCallbackInstrument 连接到 AKSequencer 轨道。设置音序器和轨道的 length到歌曲的总持续时间(注意这些属性以节拍而不是秒表示)。设置音序器的 loopEnabled如预期的。
  • 将播放事件添加到轨道,在您希望播放每个声音的时间位置。由于您将使用回调函数自己解释事件,因此使用什么类型的事件并不重要。您可以简单地使用 Note On .
  • 在回调函数中,当接收到该事件时开始播放相应的声音。

  • 您需要几个类来表示有关每个样本在歌曲中出现的位置的一些基本信息:
    class Beat {
    var sample: Sample!
    var onsetTime: Double

    var endTime {
    get {
    return onsetTime + sample.duration
    }
    }
    }

    class Sample {
    var url: URL!
    var duration: Double
    }

    class ViewController: UIViewController {
    var samples: [Sample] = []
    var beats: [Beat] = []

    var player: AKPlayer!
    var sequencer: AKSequencer!
    }
    在音符的音高上,您将存储要播放的样本的索引。这是您的回调函数的样子:
    func playCallback(status:UInt8, note:MIDINoteNumber, vel:MIDIVelocity) -> () {
    guard let status = AKMIDIStatus(byte: status),
    let type = status.type,
    type == .noteOn else { return }
    DispatchQueue.main.async {
    player.load(samples[note].url)
    player.play()
    }
    }
    您可以使用 AKSequencerseek在任意位置开始播放歌曲的方法。
    有一种特殊情况,音序器在节拍中间开始播放。在这种情况下,您必须手动开始播放该样本。
    func play(at time: Double = 0) {
    sequencer.seek(time)
    sequencer.play()
    for beat in beats {
    if beat.onsetTime < time && time < beat.endTime {
    player.load(beat.sample.url)
    player.play(from: time - beat.onsetTime)
    }
    }
    }

    关于ios - AudioKit AKPlayer 无法环回以 setPosition 开头,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66806338/

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