AVAudioPlayer 循环不是无缝的

cs *_*guy 6 avaudioplayer ios

我正在创建并播放 AVAudioPlayer,如下所示:

playerOne = try AVAudioPlayer(contentsOf: URL.init(fileURLWithPath: path))
playerOne.numberOfLoops = -1
playerOne.prepareToPlay()
Run Code Online (Sandbox Code Playgroud)

我正在播放 AAC 文件。我在用

playerOne.play(atTime: startTime)
Run Code Online (Sandbox Code Playgroud)

安排将来的播放并同步多个 AVAudioPlayer。

一切正常,但我的问题是,当声音循环时,它们会不同步,这是由于循环不无缝造成的。

这里发生的情况是,由于 aac 解码器,我相信在解码的音频数据中添加了额外的小静音,这导致音频播放器之间的同步丢失。我期望这个循环是完美的,从结束到开始循环之间的间隙为 0。

如何使用 AVAudioPlayer 实现无缝循环?

Phi*_*hov 4

使用AVAudioEngine将为您提供很大的灵活性,但如果您除了同步曲目之外不需要其他任何东西,那么它就会产生开销。

在这种情况下,您可以尝试使用AVComposition包含所有曲目的单个播放器,如下所示:

func generateComposition(urls: [URL]) throws -> AVComposition {
    let composition = AVMutableComposition()
    let audioTracks = urls
        .map(AVAsset.init(url:))
        .flatMap { $0.tracks(withMediaType: .audio) }
    
    for audioTrack in audioTracks {
        guard
            let compositionTrack = composition.addMutableTrack(withMediaType: .audio, preferredTrackID: kCMPersistentTrackID_Invalid)
        else { continue }
        
        try compositionTrack.insertTimeRange(
            audioTrack.timeRange,
            of: audioTrack,
            at: .zero
        )
    }
    return composition
}
Run Code Online (Sandbox Code Playgroud)

并使用以下方式播放AVPlayer

AVPlayer(playerItem: AVPlayerItem(asset: composition))
Run Code Online (Sandbox Code Playgroud)