Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/laravel/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios AudioKit AKPlayer无法以设置位置回环到起始位置_Ios_Audiokit - Fatal编程技术网

Ios AudioKit AKPlayer无法以设置位置回环到起始位置

Ios AudioKit AKPlayer无法以设置位置回环到起始位置,ios,audiokit,Ios,Audiokit,在v4中,如果将AKPlayer与循环一起使用,并使用setPositionAPI,则播放器将在setPosition设置的位置与播放器的总持续时间之间循环。我需要的是从setPositionAPI设置的位置开始,循环到循环发生时的开始。我不确定这是否是有意的,但我需要能够找到播放器中的某个点并循环到开始,目前看来这不是AudioKit中的功能。 有没有办法或解决办法来实现这一点?我需要按要求完成这项工作。 下面是一个完整的游乐场示例: import AudioKitPlaygrounds im

在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
预期行为 我希望它能回到开头

详情:

  • 音频套件版本4.11.2

如果您打算开发某种活套应用程序,我认为方法是使用音序器来协调音频文件的播放。在每个应该开始播放声音的位置,向序列添加一个事件

sequencer可以连接到回调工具,回调工具是将事件传递给用户定义函数的节点。在回调函数中,您将开始播放该事件指示的音频文件

这是应该做什么的概述:

  • 使用的方法创建包含播放事件的曲目。将此曲目连接到一个音乐播放器。请参阅如何将AKCallbackInstrument连接到AKSequencer磁道。将音序器和曲目的
    长度设置为歌曲的总持续时间(请注意,这些属性以节拍而不是秒表示)。根据需要设置定序器的
    循环启用
  • 在希望播放每个声音的时间位置,将播放事件添加到曲目中。由于您将使用回调函数自己解释事件,因此使用哪种类型的事件并不重要。您只需在上使用
    注释即可
  • 在回调函数中,在收到该事件时开始播放相应的声音
  • 您需要几个类来表示有关歌曲中每个示例出现的位置的一些基本信息:

    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()
        }
    }
    
    您可以使用
    AKSequencer
    seek
    方法在任意位置开始播放歌曲

    有一种特殊情况,音序器在节拍中间开始演奏。在这种情况下,必须手动开始播放该示例

    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)
            }
        }
    }
    
    func播放(时间:Double=0){
    sequencer.seek(时间)
    音序器播放()
    以拍代拍{
    如果beat.onsetTime