Я разрабатываю систему, которая должна воспроизводить фрагменты видео, которые были ранее загружены.
Сначала я создаю глобальную AVMutableComposition
локальную дорожку с addMutableTrack
, загружаю 3 фрагмента и добавляюих на ранее созданный трек через insertTimeRange
.Затем я создаю AVPlayerItem
с AVMutableComposition
.Хорошо.
Я играю в нее и работает без нареканий.Каждые 0,5 секунды я контролирую ход видео, когда оставшееся время меньше 10 секунд, оно готовит и загружает новый фрагмент.
Повторите предыдущие шаги, создав новый трек и добавив его в глобальную композицию.,Он добавляется правильно, но не к текущему игровому элементу, который заканчивается, даже если новые фрагменты в композиции.
Композиция создается как глобальная переменная
self.composition = AVMutableComposition()
guard let composition = self.composition else { return } // Always succeeded, for check if is OK.
guard let track = composition.addMutableTrack(withMediaType: .video, preferredTrackID: kCMPersistentTrackID_Invalid) else { return }
self.downloadStuff(track: track) { (_) in
let item = AVPlayerItem(asset: composition)
self.playVideo(item: item)
}
Проверьте, существует ли дорожка, или создайте новую
guard let composition = self.composition else { return }
var usableTrack = track
if usableTrack == nil {
guard let ltrack = composition.addMutableTrack(withMediaType: .video, preferredTrackID: kCMPersistentTrackID_Invalid) else { return }
usableTrack = ltrack
}
Загрузите ее, сохраняя в pathURL адрес файла
do {
let asset = AVURLAsset(url: pathURL)
let assetTrack = asset.tracks(withMediaType: .video)[0]
try usableTrack!.insertTimeRange(assetTrack.timeRange, of: assetTrack, at: CMTime(seconds: offset, preferredTimescale: CMTimeScale.zero))
self.helper.totalLenght! += duration
handleFinish(true)
} catch {
print("Error")
handleFinish(false)
}
У меня сейчас нет идей.Я пытался добавить их все к одной и той же дорожке, но она по-прежнему одинакова.Есть идеи?