#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 {}