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