AVAudioPlayer 循环不是无缝的

AVAudioPlayer loops are not seamless

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

playerOne = try AVAudioPlayer(contentsOf: URL.init(fileURLWithPath: path))
playerOne.numberOfLoops = -1
playerOne.prepareToPlay()

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

playerOne.play(atTime: startTime)

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

一切正常,但我的问题是当声音循环时它们不同步,这是因为循环不是无缝的。

这里发生的事情是,由于 aac 解码器,我认为解码后的音频数据中添加了一个超小的静音,导致音频播放器之间的同步丢失。我希望这个循环是完美的,从结束到开始循环之间的间隙为 0。

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

due to loops not being seamless.

我不确定你所说的“不无缝”是什么意思,但如果问题是你遇到了延迟,那对于 AVAudioPlayer 来说是很自然的。如果目标是以最小延迟循环,请使用 AVAudioEngine。

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

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

func generateComposition(urls: [URL]) throws -> AVComposition {
    let composition = AVMutableComposition()
    let audioTracks = urls
        .map(AVAsset.init(url:))
        .flatMap { [=10=].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
}

并使用AVPlayer播放:

AVPlayer(playerItem: AVPlayerItem(asset: composition))