Зеленый фон в видео после сшивания

#ios #swift #video #video-editing

#iOS #swift #Видео #редактирование видео

Вопрос:

Я разрабатываю приложение, которое должно записывать и склеивать записанные видео с камеры и видео из ресурсов. Сшивание работает нормально, и итоговое видео хорошо воспроизводится на устройстве. Но когда окончательное видео загружается на Facebook или YouTube, при воспроизведении видео там появляется зеленый и серый фон. Этот фон появляется в тех местах, где заканчивается записанное видео и начинается видео с ресурсов.

Вот как это выглядит:

Я использую AVFoundation для сшивания. Вот пример кода:

 let finalMixComposition : AVMutableComposition = AVMutableComposition()

    var videoCompositionTrack : [AVMutableCompositionTrack] = []
    var audioCompositionTrack : [AVMutableCompositionTrack] = []

    let finalVideoCompositionInstruction : AVMutableVideoCompositionInstruction = AVMutableVideoCompositionInstruction()

    let renderSize = CGSize(width: UIScreen.main.bounds.width, height: UIScreen.main.bounds.height)

    var startTime = CMTime.zero

    videoCompositionTrack.append(finalMixComposition.addMutableTrack(withMediaType: .video, preferredTrackID: kCMPersistentTrackID_Invalid)!)
    audioCompositionTrack.append(finalMixComposition.addMutableTrack(withMediaType: .audio, preferredTrackID: kCMPersistentTrackID_Invalid)!)

    let arrayVideos : [URL] = [firstVideo, secondVideo, thirdVideo, fourthVideo]

    for url in arrayVideos {
        let videoAsset : AVAsset = AVAsset(url: url)

        let aVideoAssetTrack = videoAsset.tracks(withMediaType: AVMediaType.video)[0]

        var aAudioAssetTrack = videoAsset.tracks(withMediaType: AVMediaType.audio)[0]

        do {
            try videoCompositionTrack[0].insertTimeRange(CMTimeRangeMake(start: CMTime.zero, duration: aVideoAssetTrack.timeRange.duration),
                                                         of: aVideoAssetTrack,
                                                         at: startTime)

            try audioCompositionTrack[0].insertTimeRange(CMTimeRangeMake(start: CMTime.zero, duration: aVideoAssetTrack.timeRange.duration),
                                                            of: aAudioAssetTrack,
                                                            at: startTime)
        }
        catch {
            print("error")
        }

        startTime = CMTime(seconds: startTime.seconds   aVideoAssetTrack.timeRange.duration.seconds)
    }

    finalVideoCompositionInstruction.timeRange = CMTimeRangeMake(start: CMTime.zero, duration: startTime)

    let mutableVideoComposition : AVMutableVideoComposition = AVMutableVideoComposition()
    mutableVideoComposition.frameDuration = CMTimeMake(value: 0, timescale: 60)

    mutableVideoComposition.renderSize = renderSize

    let savePathUrl = tempURL()

    let assetExport: AVAssetExportSession = AVAssetExportSession(asset: finalMixComposition,
                                                                 presetName: AVAssetExportPresetHighestQuality)!
    assetExport.outputFileType = AVFileType.mp4
    assetExport.outputURL = savePathUrl
    assetExport.shouldOptimizeForNetworkUse = true

    assetExport.exportAsynchronously {}

  

Есть подозрение, что это связано с разными параметрами видео. У кого-нибудь есть идеи, как это решить? Спасибо за помощь 😉

Ответ №1:

Решена проблема с прошивкой видео. Необходимо было указать битрейт, кодек, уровень профиля в настройках видео. Для решения я нашел библиотеку, которая это сделала: SDAVAssetExportSession

Вот пример кода:

 let encoder = SDAVAssetExportSession(asset: finalMixComposition)
    encoder!.outputFileType = AVFileType.mp4.rawValue
    encoder!.outputURL = savePathUrl
    encoder!.videoSettings = [AVVideoCodecKey: AVVideoCodecType.h264,
                              AVVideoWidthKey: 1024,
                              AVVideoHeightKey: 768,
                              AVVideoCompressionPropertiesKey: [AVVideoAverageBitRateKey: 6000000,
                                                                AVVideoProfileLevelKey: AVVideoProfileLevelH264High40]]

    encoder!.audioSettings = [AVFormatIDKey: kAudioFormatMPEG4AAC,
                              AVNumberOfChannelsKey: 2,
                              AVSampleRateKey: 44100,
                              AVEncoderBitRateKey: 128000]

    encoder!.exportAsynchronously {}