gpt4 book ai didi

swift - 如果轨道不是从头开始的,如何使用循环(缓冲类型 = .always in AKPlayer )

转载 作者:行者123 更新时间:2023-12-04 17:33:18 24 4
gpt4 key购买 nike

我运行了几个具有不同文件和相同长度的 AKPlayer - 第一个从头开始,其他的从相对于第一个时间的按钮开始。文件是无缝的,值得缓冲 type = .always, loop = true。如果 AKPlayer 没有从头开始播放,那么只会播放从该轨道开始播放到结束的那部分轨道,并且当循环发生时,starts StartTime 不是零值。有必要在循环播放时从头开始播放所有轨道。使用 AKWaveTable,一切正常,但播放器中没有声像和音高设置。

这是一个示例代码。在原版中,我使用了一系列播放器,并在一个循环中将所有文件上传到我的播放器。我正在做类似 drummachine 的事情——几个音频文件正在播放,我可以根据播放器首次启动的时间并行打开/关闭其他文件。每个文件的持续时间相同。当我在 AKWaveTable 中做同样的事情时,一切正常,但将来它不适合我。在此示例中,我首先运行 playPlayer1 方法,稍后运行 playPlayer2。当Player1从头开始循环,然后Player2从前一个currentTime开始循环(比如从文件中间开始),它的长度永远变得相等(endTime - currentTime)

 var player1: AKPlayer!
var player2: AKPlayer!
var playersMixer: AKMixer!

init() {
do {
let file1 = try AKAudioFile(readFileName: "Audio/file1.m4a")
let file2 = try AKAudioFile(readFileName: "Audio/file2.m4a")

player1.load(audioFile: file1)
player2.load(audioFile: file2)
} catch {
print(error.localizedDescription)
}

player1.buffering = .always
player1.isLooping = true
player2.buffering = .always
player2.isLooping = true

playersMixer = AKMixer (player1,player2)
AudioKit.output = playersMixer
do {
try AudioKit.start()
} catch {
print(error.localizedDescription)
}
}
func playPlayer1() {
player1.play()
}
func playPlayer2() {
player2.play(from: currentTime)
}
var currentTime: Double {
get {
if player1.isPlaying {
return player1.currentTime
}
return 0
}
}

最佳答案

我认为这是 AudioKit 中缺少的功能或错误。同时,正如我们在源代码 (https://github.com/AudioKit/AudioKit/blob/master/AudioKit/Common/Nodes/Playback/Players/Player/AKPlayer.swift) 中看到的那样,当前版本确实使用 startTime 作为循环点

同时,我找到了一个解决方案,希望它对其他读者有用:

                    player.isLooping = false
player.buffering = .dynamic
player.completionHandler = {
player.isLooping = true
player.buffering = .always
player.play(from: 0, to: player.duration)
}
player.play(from: masterPlayer.currentTime)

我正在做的是创建一个播放器并错误地设置 .isLooping.buffering 并调用 .play 运行它一次性或单次射击游戏! .completionHandler 回调在完成时被调用,我在这里设置了 .isLooping.buffering 。最后,调用 .play 使用属性 fromto from self 设置所需的循环点。 masterPlayer 指的是一个单独的player,用作获取当前播放位置的引用,我知道这很容易理解,但只是为了避免假设。

编辑:

在进行 throw 测试后,我发现了一个我之前报告并删除的问题 (Is synchronised looping supported for AKPlayers that are multiples in their duration?) 并且不得不重新打开,所以希望我能得到答案并帮助理解它是否应该工作。

还强制 player detach 并创建一个新的:

                        player.completionHandler = {
player.detach()
let player = self.createPlayer(audioFile: audioFile)
self.connectPlayerToMixer(player)
player.isLooping = true
player.buffering = .always
player.startTime = 0
player.endTime = audioFile.duration
player.play(at: AVAudioTime.now())
}

我现在已经测试了 AKWaveTable,希望我做的是正确的,但它在两倍于预览记录大小的记录之后也失败了,例如:

  • 循环 1 > 1 2 3 4
  • 循环 2 > 1 2 3 4
  • 循环 3 > 1 2 3 4 5 6 7 8
  • 循环 4 > 1 2 3 4
  • 循环 5 > 5 6 7 8(记录为 1 2 3 4 5 6 7 8,但播放为 5 6 7 8)

我将不得不返回并测试原始的 AKNodeRecorder 以查看行为是否相似,但目前我将尝试使用 AKWaveTable 进行另一次测试。

    • 经过一段时间的测试 * *

这是描述上述问题的录音:

https://drive.google.com/open?id=1zxIJgFFvTwGsve11RFpc-_Z94gEEzql7

在研究问题一段时间后,我发现了似乎是解决方案的所有研究。通过转移使用的程序!与其将播放器设置为沿当前时间开始,不如将其安排为从开始时间开始。这是因为开始时间用于循环开始和终点!要了解更多信息,请点击我之前发布的另一篇 StackOverflow 帖子的链接(此处提供了解决方案 ( Is synchronised looping supported for AKPlayers that are multiples in their duration? ),谢谢!

关于swift - 如果轨道不是从头开始的,如何使用循环(缓冲类型 = .always in AKPlayer ),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57764856/

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