AVMutableComposition — воспроизводится только первый трек (Swift)

У меня есть массив [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

person sean    schedule 16.05.2016    source источник


Ответы (1)


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

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

РЕДАКТИРОВАТЬ: я упоминал ранее, что мне все еще интересно, как воспроизвести несколько треков в одном ресурсе. Это не так работает, теперь я понимаю. Хороший ресурс:

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

person sean    schedule 17.05.2016
comment
Это неправильно. Вы можете воспроизвести несколько дорожек, если создадите AVMutableVideoComposition и установите непрозрачность дорожки на 0 (в конце дорожки) в LayerInstruction этой дорожки. - person Tiko; 05.07.2017
comment
Здесь написано: По возможности у вас должен быть только один трек композиции для каждого типа медиа. Эта унификация совместимых дорожек ресурсов приводит к минимальному использованию ресурсов. При последовательном представлении медиаданных следует помещать любые медиаданные одного типа на одну и ту же дорожку композиции. - person Ian Warburton; 08.06.2020
comment
Сделав это, я смог воспроизвести объединенное видео в AVPlayer, но во время воспроизведения я получаю неправильную ориентацию для второго видео, но после экспорта получаю правильную ориентацию. Любое решение для того же? - person Shivani Bajaj; 28.07.2020