Как я могу играть в AVMutableComposition при добавлении фрагментов видео - PullRequest
0 голосов
/ 21 мая 2019

Я разрабатываю систему, которая должна воспроизводить фрагменты видео, которые были ранее загружены.

Сначала я создаю глобальную 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)
    }

У меня сейчас нет идей.Я пытался добавить их все к одной и той же дорожке, но она по-прежнему одинакова.Есть идеи?

...