Объединить два видео в Swift 4? - PullRequest
0 голосов
/ 10 мая 2018

Итак, у меня уже есть два .mp4, записанные и сохраненные в приложении, и я хочу добавить один к другому и экспортировать как новое видео. Это вроде работает, но не совсем!

    let composition = AVMutableComposition()
    var track = composition.addMutableTrack(withMediaType: AVMediaType.video, preferredTrackID:Int32(kCMPersistentTrackID_Invalid))

    let videoAsset = AVAsset(url: AAA as URL) as AVAsset
    let videoAsset2 = AVAsset(url: BBB as URL) as AVAsset
    do {
        try track?.insertTimeRange(CMTimeRangeMake(kCMTimeZero, videoAsset.duration), of: videoAsset.tracks(withMediaType: AVMediaType.video)[0] as AVAssetTrack, at: kCMTimeZero)
        try track?.insertTimeRange(CMTimeRangeMake(kCMTimeZero, videoAsset.duration), of: videoAsset2.tracks(withMediaType: AVMediaType.video)[0] as AVAssetTrack, at: kCMTimeZero)

    } catch {
        print("darn")
    }

    let exporter = AVAssetExportSession(asset: composition, presetName: AVAssetExportPresetHighestQuality)
    exporter?.outputURL = CCC
    exporter?.outputFileType = AVFileType.mp4
    exporter?.shouldOptimizeForNetworkUse = true


    exporter?.exportAsynchronously {
        print("done?")
    }

Этот тип объединяет видео, но он добавляет массивные куски черного экрана между двумя клипами и удаляет звук. Я не могу найти какие-либо недавние ответы на эту проблему. Спасибо за помощь!

1 Ответ

0 голосов
/ 11 мая 2018

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

Отсутствие звука связано с тем, что вы не вставляете какие-либо звуковые дорожки в композицию.

Попробуйте что-то вроде этого (повторяющегося) фрагмента:

// video
try track?.insertTimeRange(CMTimeRangeMake(kCMTimeZero, videoAsset.duration), of: videoAsset.tracks(withMediaType:.video)[0] as AVAssetTrack, at: kCMTimeZero)
try track?.insertTimeRange(CMTimeRangeMake(kCMTimeZero, videoAsset2.duration), of: videoAsset2.tracks(withMediaType:.video)[0] as AVAssetTrack, at: videoAsset.duration)

// audio
try track?.insertTimeRange(CMTimeRangeMake(kCMTimeZero, videoAsset.duration), of: videoAsset.tracks(withMediaType:.audio)[0] as AVAssetTrack, at: kCMTimeZero)
try track?.insertTimeRange(CMTimeRangeMake(kCMTimeZero, videoAsset2.duration), of: videoAsset2.tracks(withMediaType:.audio)[0] as AVAssetTrack, at: videoAsset.duration)

Отказ от ответственности: я не уверен, является ли хорошей практикой использование длительности AVAsset AVAssetTrack в качестве прокси для длины трека. Может быть, вы должны использовать AVAssetTrack.timeRange.

...