У меня есть массив [AVAsset], и я пытаюсь объединить все эти активы в один актив, чтобы я мог беспрепятственно воспроизводить видео (я пытался использовать 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