我正在创建并播放 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 实现无缝循环?
使用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)
| 归档时间: |
|
| 查看次数: |
621 次 |
| 最近记录: |