2016-05-16 7 views
1

У меня есть массив [AVAsset], и я пытаюсь объединить все эти активы в один актив, чтобы я мог воспроизводить видео без проблем (я попытался использовать AVQueuePlayer , но это не обеспечивает бесперебойную активацию активов).AVMutableComposition - только воспроизведение первого трека (Swift)

Ниже приведено то, что у меня есть до сих пор, но когда я пытаюсь сыграть финальную композицию, он воспроизводит только первый трек, хотя он показывает, что у него есть все треки, а общая продолжительность равна всем трекам вместе.

Я пропустил шаг, хотя кажется, что все композиции находятся в композиции? Возможно, мне нужно обрабатывать 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 

ответ

4

Я смог выяснить ответ на самый важный вопрос. Чтобы играть все клипы вместе, они должны быть в одном треке. Для этого переместите следующую строку снаружи (перед) для цикла:

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 

EDIT: Я уже упоминал, что я до сих пор интересно, как для воспроизведения нескольких треков в одном актив. Я не понимаю, как это работает. Хороший ресурс:

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

+0

То не правильно, Вы можете играть несколько треков, если Вы создаете 'AVMutableVideoComposition' и установите непрозрачность пути к 0 (на конец дорожки) в layerInstruction этого трека. – Tiko

 Смежные вопросы

  • Нет связанных вопросов^_^