2016-05-16 6 views
1

私は[AVAsset]の配列を持っています。これらのすべてのアセットを単一のアセットに結合して、ビデオをシームレスに再生できるようにしようとしています(AVQueuePlayer 、それは資産をシームレスに再生しません)。AVMutableComposition - 最初のトラックだけを再生する(Swift)

以下はこれまでの内容ですが、最終的なコンポジションを再生しようとすると、すべてのトラックと合計の継続時間が同じトラックであることを示していますが、最初のトラックのみを再生します。

すべてのトラックが合成されているように見えますが、ステップがありませんか?おそらくAVPlayerItemに複数のトラックがある場合、AVPlayerを別々に処理する必要がありますか?

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

私は最も重要な質問に対する答えを見つけ出すことができました。すべてのクリップを一緒に再生するには、同じトラックにいる必要があります。これを行うには、forループ(前の)外の次の行を移動:

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:ここ

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

がいっぱいです、コードを修正し、私は以前、私はまだどのように思っていたことを述べました1つのアセットで複数のトラックを再生することができます。それはどのように動作するのではない、私は今理解しています。優れたリソース:

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

+0

厥正しくないはあなたが 'AVMutableVideoComposition'を作成する場合は、複数のトラックを再生することができ、かつそのトラックのlayerInstructionで(トラック側の)0にトラックの不透明度を設定します。 – Tiko

関連する問題