Редактировать часть видео (используя AVFoundation)

У меня есть код, приведенный ниже. Это займет 2 ресурса видео и вставит второй ресурс в первый ресурс. На данный момент я каждый раз вызываю новый AVMutableComposition и возвращаю полностью новую композицию, что занимает много времени. Я полагаю, что есть способ удалить часть видео, вставить другую часть без необходимости создавать всю композицию. Какие-либо предложения? (Код работает, действительно нужно сократить потребление времени).

1) Есть ли способ просто изменить часть видео вместо (это то, что я делаю сейчас каждый раз, когда мне нужно изменить видео)

  • 1) создание НОВОЙ AVMutableComposition
  • 2) Добавление первого видео
  • 3) Добавление второго видео
  • 4) Добавление последней части первого видео

Или есть способ... (Что я хотел бы сделать вместо этого)

  • 1) Получить первое видео
  • 2) Перейдите к установке времени, которое я хочу изменить (скажем, на 10 секунд)
  • 3) Удалите количество времени, которое я хочу, затем вставьте время второго видео.
  • 4) Шага 4 не будет, так как я буду менять только часть видео, а не воссоздавать полностью новое.

Мой текущий код

    let mixComposition = AVMutableComposition()

    let firstTrack = mixComposition.addMutableTrackWithMediaType(AVMediaTypeVideo, preferredTrackID: Int32(kCMPersistentTrackID_Invalid))
    do {
        try firstTrack.insertTimeRange(CMTimeRangeMake(kCMTimeZero, CMTime(seconds: 10, preferredTimescale: 600)), ofTrack: firstAsset.tracksWithMediaType(AVMediaTypeVideo)[0], atTime: kCMTimeZero)
    } catch _ {
        print("Failed to load first track")
    }

    let secondTrack = mixComposition.addMutableTrackWithMediaType(AVMediaTypeVideo, preferredTrackID: Int32(kCMPersistentTrackID_Invalid))
    do {
        try secondTrack.insertTimeRange(CMTimeRangeMake(kCMTimeZero, secondAsset.duration), ofTrack: secondAsset.tracksWithMediaType(AVMediaTypeVideo)[0], atTime: CMTime(seconds: 10, preferredTimescale: 600))

    } catch _ {
        print("Failed to load second track")
    }

    let thirdTrack = mixComposition.addMutableTrackWithMediaType(AVMediaTypeVideo, preferredTrackID: Int32(kCMPersistentTrackID_Invalid))
    do {
        try thirdTrack.insertTimeRange(CMTimeRangeMake(kCMTimeZero, secondAsset.duration+CMTime(seconds: 10, preferredTimescale: 600)), ofTrack: firstAsset.tracksWithMediaType(AVMediaTypeVideo)[0], atTime: CMTime(seconds: 10, preferredTimescale: 600))

    } catch _ {
        print("Failed to load second track")
    }

person impression7vx    schedule 11.07.2016    source источник
comment
Вы нашли решение?   -  person Crashalot    schedule 16.12.2017
comment
я ответил на другой вопрос, который я задал   -  person impression7vx    schedule 16.12.2017
comment
@Crashalot дайте мне полчаса, чтобы вернуться к вам по этой ссылке или проверить мой профиль и покопаться   -  person impression7vx    schedule 16.12.2017
comment
это был ответ? stackoverflow.com/a/43797626/144088   -  person Crashalot    schedule 18.12.2017
comment
Да. Извини. Был занят   -  person impression7vx    schedule 18.12.2017
comment
нет проблем, но вы говорите, что этот код существенно ускорил процесс экспорта? кажется, что это все равно потребует много времени?   -  person Crashalot    schedule 18.12.2017
comment
Каждый раз приходится создавать новую композицию. Это определенно занимает мое системное время, в зависимости от размера объединенных активов. Что именно вы ищете?   -  person impression7vx    schedule 18.12.2017
comment
более быстрый способ добавить наложение к видео, созданному камерой устройства. до сих пор лучший подход — использовать avassetwriter и добавлять оверлей во время создания видео в первый раз, но проблема заключается в том, как преобразовать оверлей (UIImage) в CMSampleBuffer для использования avassetwriter. Любые идеи?   -  person Crashalot    schedule 18.12.2017