Объединять видео и изображения в AVMutableComposition, используя AVMutableCompositionTrack, а не AVVideoCompositionCoreAnimationTool?

Код ниже экспортирует видео, используя AVMutableComposition. Но в экспортированном видео, если вы хотите, чтобы изображение отображалось в течение 3 секунд после окончания исходного видео, есть ли способ сделать это с помощью AVMutableCompositionTrack или вам нужно добавить слой изображения и анимировать его внешний вид после окончания видео?

В конце концов, цель состоит в том, чтобы объединить произвольное количество изображений и видео в одно мастер-видео.

К сожалению, во время тестирования выяснилось, что AVVideoCompositionCoreAnimationTool сильно замедляет процесс экспорта (с ‹ 1 секунды до 10-20 секунд), поэтому цель состоит в том, чтобы по возможности избежать AVVideoCompositionCoreAnimationTool.

    // Create composition object
    let composition = AVMutableComposition()
    let compositionVideoTrack = composition.addMutableTrackWithMediaType(AVMediaTypeVideo, preferredTrackID: CMPersistentTrackID(kCMPersistentTrackID_Invalid))
    let compositionAudioTrack = composition.addMutableTrackWithMediaType(AVMediaTypeAudio, preferredTrackID: CMPersistentTrackID(kCMPersistentTrackID_Invalid))
    var insertTime = kCMTimeZero

    // Extract tracks from slice video
    let videoURL = NSURL(fileURLWithPath: videoPath)
    let videoAsset = AVURLAsset(URL: videoURL, options: nil)
    let sourceVideoTrack = videoAsset.tracksWithMediaType(AVMediaTypeVideo)[0]
    let sourceAudioTrack = videoAsset.tracksWithMediaType(AVMediaTypeAudio)[0]
    do {
        try compositionVideoTrack.insertTimeRange(CMTimeRangeMake(kCMTimeZero, videoAsset.duration), ofTrack: sourceVideoTrack, atTime: kCMTimeZero)
        try compositionAudioTrack.insertTimeRange(CMTimeRangeMake(kCMTimeZero, videoAsset.duration), ofTrack: sourceAudioTrack, atTime: kCMTimeZero)
    } catch {
        print("Error with insertTimeRange while exporting video: \(error)")
    }

    // Export composition to video
    let outputURL = getFilePath(getUniqueFilename(gMP4File))
    let exporter = AVAssetExportSession(asset: composition, presetName: AVAssetExportPresetHighestQuality)
    exporter!.outputURL = NSURL(fileURLWithPath: outputURL)
    exporter!.outputFileType = AVFileTypeMPEG4
    exporter!.exportAsynchronouslyWithCompletionHandler({
        self.exportDidFinish(exporter!)
    })

person Crashalot    schedule 22.01.2016    source источник


Ответы (1)


После консультации с другими по SO и проведения дополнительных веб-исследований кажется, что это невозможно. Для объединения изображения с видео в основное видео, которое можно воспроизвести из приложения, требуется AVVideoCompositionCoreAnimationTool.

person Crashalot    schedule 25.01.2016
comment
@Crashhalot, пожалуйста, взгляните на это stackoverflow.com/questions/51009489/. Не могли бы вы мне помочь? - person Ahtazaz; 20.04.2019