Не знаю, где еще спросить об этом, поэтому я решил начать здесь.
У меня есть два видеоклипа. Ни один из видеоклипов не содержит звука.
Один видеоклип снимается с камеры iPhone через AVCaptureSession.
Второй видеоклип хранится локально на устройстве.
Я хочу объединить два видео таким образом, чтобы полностью воспроизвести захваченное видео, за которым сразу следует одна секунда второго видеоклипа. Затем я объединяю новый видеоклип с заранее определенным аудиофайлом и перехожу в свое меню общего доступа, где сохраняю его в фотопленке.
Окончательный результат воспроизводится точно так же, как и должен быть в фотопленке. Однако, когда я делюсь видео с Facebook, первый видеоклип искажается как зеленый или иногда серый экран. Второй клип проигрывается нормально, когда приходит его время. И звук хороший во всем.
Я понятия не имею, что вызывает это.
Любая помощь?
func mergeVideos() {
let videoAsset = AVAsset(URL: recordedVideoURL)
let videoAsset2 = AVAsset(URL: NSURL(fileURLWithPath: NSBundle.mainBundle().pathForResource("Credits", ofType: "mp4")!))
let audioAsset = AVAsset(URL: finalAudioURL)
// 1 - Create AVMutableComposition object.
let mixComposition = AVMutableComposition()
// 2 - Audio track
do {
let audioTrack = mixComposition.addMutableTrackWithMediaType(AVMediaTypeAudio, preferredTrackID: 0)
try audioTrack.insertTimeRange(CMTimeRangeMake(kCMTimeZero, audioAsset.duration + CMTime(seconds: 1, preferredTimescale: 30)), ofTrack: audioAsset.tracksWithMediaType(AVMediaTypeAudio)[0], atTime: kCMTimeZero)
} catch {
print(error)
}
// 3 - Video tracks
do {
let videoTrack = mixComposition.addMutableTrackWithMediaType(AVMediaTypeVideo, preferredTrackID: Int32(kCMPersistentTrackID_Invalid))
try videoTrack.insertTimeRange(CMTimeRangeMake(kCMTimeZero, videoAsset.duration), ofTrack: videoAsset.tracksWithMediaType(AVMediaTypeVideo)[0], atTime: kCMTimeZero)
try videoTrack.insertTimeRange(CMTimeRangeMake(kCMTimeZero, audioAsset.duration-videoAsset.duration + CMTime(seconds: 1, preferredTimescale: 30)), ofTrack: videoAsset2.tracksWithMediaType(AVMediaTypeVideo)[0], atTime: videoAsset.duration)
} catch {
print(error)
}
// 5 - Create Exporter
let exporter = AVAssetExportSession(asset: mixComposition, presetName: AVAssetExportPresetHighestQuality)
deleteFileAtURL(videoToShareURL)
exporter!.outputURL = videoToShareURL
exporter!.outputFileType = AVFileTypeMPEG4
exporter!.shouldOptimizeForNetworkUse = true
// 6 - Perform the Export
exporter!.exportAsynchronouslyWithCompletionHandler() {
dispatch_async(dispatch_get_main_queue(), { () -> Void in
hideSpinner()
self.performSegueWithIdentifier("backToShare", sender: self)
})
}
}