2016-05-16 1 views
1

J'ai un tableau de [AVAsset], et j'essaie de combiner tous ces assets dans un seul Asset pour pouvoir lire la vidéo de façon transparente (j'ai essayé d'utiliser AVQueuePlayer , mais cela ne joue pas les actifs de façon transparente).AVMutableComposition - Lecture uniquement de la première piste (Swift)

Voici ce que j'ai jusqu'ici, mais quand j'essaie de jouer la composition finale, elle ne joue que la première piste, même si elle montre qu'elle a toutes les pistes et que la durée totale est égale à toutes les pistes. Est-ce qu'il me manque une étape, même s'il semble que toutes les pistes sont dans la composition? Peut-être que je dois gérer l'AVPlayer différemment si l'AVPlayerItem a plusieurs pistes?

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 

Répondre

4

J'ai été capable de trouver une réponse à la question la plus importante. Afin de jouer tous les clips ensemble, ils doivent être dans la même piste. Pour ce faire, déplacer la ligne suivante à l'extérieur (avant) la boucle:

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

est complet ici, code corrigé:

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: je l'ai mentionné plus tôt que je demande encore comment pour lire plusieurs pistes dans un actif. Ce n'est pas comme ça que ça fonctionne, je comprends maintenant. Une bonne ressource:

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

+0

Cest pas correct, vous pouvez jouer plusieurs pistes si vous créez un 'AVMutableVideoComposition', et définir l'opacité de la piste à 0 (sur la fin de piste) dans layerInstruction de cette piste. – Tiko