AVMutableComposition – 只播放第一首歌(Swift)

我有一个[AVAsset]数组,我试图将所有这些资产合并到一个单一的资产,以便我可以无缝地播放video(我尝试使用AVQueuePlayer,但不会无缝地播放资产)。

下面是我到目前为止,但是当我尝试播放最后的作曲,它只播放第一首曲目,即使它显示它具有所有曲目,并且总持续时间等于所有曲目一起。

即使看起来所有的曲目都在曲目中,我是否错过了一个步骤? 也许我需要以不同的方式处理AVPlayer,如果AVPlayerItem有多个轨道?

let playerLayer: AVPlayerLayer = AVPlayerLayer() lazy var videoPlayer: AVPlayer = AVPlayer() var videoClips = [AVAsset]() let videoComposition = AVMutableComposition() var playerItem: AVPlayerItem! var lastTime: CMTime = kCMTimeZero for clipIndex in videoClips { let videoCompositionTrack = videoComposition.addMutableTrackWithMediaType(AVMediaTypeVideo, preferredTrackID: Int32(kCMPersistentTrackID_Invalid)) do { try videoCompositionTrack.insertTimeRange(CMTimeRangeMake(kCMTimeZero, clipIndex.duration), ofTrack: clipIndex.tracksWithMediaType(AVMediaTypeVideo)[0] , atTime: lastTime) lastTime = CMTimeAdd(lastTime, clipIndex.duration) } catch { print("Failed to insert track") } } print("VideoComposition Tracks: \(videoComposition.tracks.count)") // Shows multiple tracks playerItem = AVPlayerItem(asset: videoComposition) print("PlayerItem Duration: \(playerItem.duration.seconds)") // Shows the duration of all tracks together print("PlayerItem Tracks: \(playerItem.tracks.count)") // Shows same number of tracks as the VideoComposition Track count videoPlayer = AVPlayer(playerItem: playerItem) playerLayer.player = videoPlayer videoPlayer.volume = 0.0 videoPlayer.play() // Only plays the first track 

我能够找出答案是最重要的问题。 为了一起播放所有的剪辑,他们需要在同一个轨道上。 为此,请在for循环之外(之前)移动以下行:

 let videoCompositionTrack = videoComposition.addMutableTrackWithMediaType(AVMediaTypeVideo, preferredTrackID: Int32(kCMPersistentTrackID_Invalid)) 

这里是完整的,更正的代码:

 let playerLayer: AVPlayerLayer = AVPlayerLayer() lazy var videoPlayer: AVPlayer = AVPlayer() var videoClips = [AVAsset]() let videoComposition = AVMutableComposition() var playerItem: AVPlayerItem! var lastTime: CMTime = kCMTimeZero let videoCompositionTrack = videoComposition.addMutableTrackWithMediaType(AVMediaTypeVideo, preferredTrackID: Int32(kCMPersistentTrackID_Invalid)) for clipIndex in videoClips { do { try videoCompositionTrack.insertTimeRange(CMTimeRangeMake(kCMTimeZero, clipIndex.duration), ofTrack: clipIndex.tracksWithMediaType(AVMediaTypeVideo)[0] , atTime: lastTime) lastTime = CMTimeAdd(lastTime, clipIndex.duration) } catch { print("Failed to insert track") } } print("VideoComposition Tracks: \(videoComposition.tracks.count)") // Shows multiple tracks playerItem = AVPlayerItem(asset: videoComposition) print("PlayerItem Duration: \(playerItem.duration.seconds)") // Shows the duration of all tracks together print("PlayerItem Tracks: \(playerItem.tracks.count)") // Shows same number of tracks as the VideoComposition Track count videoPlayer = AVPlayer(playerItem: playerItem) playerLayer.player = videoPlayer videoPlayer.volume = 0.0 videoPlayer.play() // Does play all clips sequentially 

编辑:我刚才提到,我还在想如何在一个资产上播放多个曲目。 这不是它的工作原理,现在我明白了。 一个好的资源:

https://developer.apple.com/library/mac/documentation/AudioVideo/Conceptual/AVFoundationPG/Articles/04_MediaCapture.html