我正试着制作一个背景音乐循环游戏。我在Audition中制作了歌曲文件(这类似于大胆),当我在Audition的循环中播放它时,它会循环我想要的。
然而,当我在Xcode中播放它时,它在循环之间有一个滞后。我正在使用AVFoundations的声音播放。
我到处找遍了,但找不到解决问题的办法。
有没有任何方法可以循环音频文件,而不存在任何滞后之间?(我相信这叫“无缝循环”)
以下是代码:
class GameScene: SKScene {
...// Other Code
var ButtonAudio = URL(fileURLWithPath: Bundle.main.path(forResource: "Gamescene(new)", ofType: "mp3")!)
var ButtonAudioPlayer = AVAudioPlayer()
... //Other Code
}当我称之为:
override func didMove(to view: SKView) {
...//Code
ButtonAudioPlayer = try! AVAudioPlayer(contentsOf: ButtonAudio, fileTypeHint: nil)
ButtonAudioPlayer.numberOfLoops = -1
ButtonAudioPlayer.prepareToPlay()
ButtonAudioPlayer.play()
...//More Code
}有人能帮我解决这个问题吗?
提前谢谢你!
发布于 2017-12-03 16:13:00
您可以使用AVPlayerLooper和AVQueuePlayer来完成这个任务。
import UIKit
import AVFoundation
class ViewController: UIViewController {
var queuePlayer = AVQueuePlayer()
var playerLooper: AVPlayerLooper?
override func viewDidLoad() {
super.viewDidLoad()
guard let url = Bundle.main.url(forResource: "Gamescene(new)", withExtension: "mp3") else { return }
let playerItem = AVPlayerItem(asset: AVAsset(url: url))
playerLooper = AVPlayerLooper(player: queuePlayer, templateItem: playerItem)
queuePlayer.play()
}
}发布于 2019-08-15 09:44:58
@dave234 234提出的解决方案只适用于iOS > 10。由于我需要在iOS > 9中进行无缝播放,所以我做了一些不同的事情:
AVPlayer,而是创建了AVQueuePlayer,并立即向队列中添加了两个相同的旋律。事实上,为了避免拖延,我总是弹倒数第二张唱片。
我的代码:
var player: AVQueuePlayer?
override func viewDidLoad() {
super.viewDidLoad()
if let path = Bundle.main.path(forResource: "music_file", ofType: "mp3") {
player = createPlayer(url: URL(fileURLWithPath: path))
}
}
func createPlayer(url: URL) -> AVQueuePlayer {
let player = AVQueuePlayer(items: [AVPlayerItem(url: url), AVPlayerItem(url: url)])
loopPlayer(playerItem: player.items()[player.items().count - 2])
return player
}
func loopPlayer(playerItem: AVPlayerItem) {
NotificationCenter.default.addObserver(forName: .AVPlayerItemDidPlayToEndTime, object: playerItem, queue: .main) { _ in
if let player = self.player, let url = (playerItem.asset as? AVURLAsset)?.url {
player.insert(AVPlayerItem(url: url), after: player.items()[player.items().count - 1])
self.loopPlayer(playerItem: player.items()[player.items().count - 2])
}
}
}https://stackoverflow.com/questions/47605956
复制相似问题