首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何循环背景音乐不滞后/延迟时,歌曲重复(无缝)

如何循环背景音乐不滞后/延迟时,歌曲重复(无缝)
EN

Stack Overflow用户
提问于 2017-12-02 08:20:56
回答 2查看 1.1K关注 0票数 1

我正试着制作一个背景音乐循环游戏。我在Audition中制作了歌曲文件(这类似于大胆),当我在Audition的循环中播放它时,它会循环我想要的。

然而,当我在Xcode中播放它时,它在循环之间有一个滞后。我正在使用AVFoundations的声音播放。

我到处找遍了,但找不到解决问题的办法。

有没有任何方法可以循环音频文件,而不存在任何滞后之间?(我相信这叫“无缝循环”)

以下是代码:

代码语言:javascript
运行
复制
class GameScene: SKScene {
...// Other Code

var ButtonAudio = URL(fileURLWithPath: Bundle.main.path(forResource: "Gamescene(new)", ofType: "mp3")!)
var ButtonAudioPlayer = AVAudioPlayer()

... //Other Code

}

当我称之为:

代码语言:javascript
运行
复制
 override func didMove(to view: SKView) {

    ...//Code

    ButtonAudioPlayer = try! AVAudioPlayer(contentsOf: ButtonAudio, fileTypeHint: nil)
    ButtonAudioPlayer.numberOfLoops = -1
    ButtonAudioPlayer.prepareToPlay()
    ButtonAudioPlayer.play()

    ...//More Code
    }

有人能帮我解决这个问题吗?

提前谢谢你!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-12-03 16:13:00

您可以使用AVPlayerLooperAVQueuePlayer来完成这个任务。

代码语言:javascript
运行
复制
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()
    }
}
票数 3
EN

Stack Overflow用户

发布于 2019-08-15 09:44:58

@dave234 234提出的解决方案只适用于iOS > 10。由于我需要在iOS > 9中进行无缝播放,所以我做了一些不同的事情:

  1. 我没有创建AVPlayer,而是创建了AVQueuePlayer,并立即向队列中添加了两个相同的旋律。
  2. 接下来,我做了一个聆听倒数第二个旋律的人。
  3. 当侦听器被触发时,我在最后一个队列之后向队列添加了另一个类似的记录。

事实上,为了避免拖延,我总是弹倒数第二张唱片。

我的代码:

代码语言:javascript
运行
复制
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])
        }
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47605956

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档