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))
我正在创建和播放 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))