Я использую хорошо известный PBJVision для записи видео, которые затем должны быть объединены вместе. Я использую AVMutableComposition для объединения видео с помощью insertTimeRange (_: ofAsset: atTime: error :). Это хорошо работает, если видео сделаны с той же камерой. Но, например, если взять камеру с задней камерой, а затем взять другую, используя переднюю камеру, видео последнего видео отсутствует. Похоже, добавлен только звук. Вот мой код:AVMutableComposition отсутствует фрейм рекордер с разностными камерами iPad
var error: NSError? = nil
let composition = AVMutableComposition()
var currentTime = kCMTimeZero
for (index, videoURL) in enumerate(videoURLS) {
let asset = AVURLAsset.assetWithURL(videoURL) as! AVAsset
let success = composition.insertTimeRange(CMTimeRange(start: kCMTimeZero, duration: asset.duration),
ofAsset: asset,
atTime: currentTime,
error: &error)
if !success {
if error != nil {
println("timerange isnert error - \(error?.localizedDescription)")
}
}
// add time till we get to the last video
if index < videoURLS.count - 1 {
currentTime = CMTimeAdd(currentTime, asset.duration)
}
}
let outputURL = fileSystemHelper.temporaryStorageURLForExportSession()
let fileManager = NSFileManager.defaultManager()
fileManager.removeItemAtURL(outputURL, error: &error)
if error != nil {
println("export session file removal error - \(error?.localizedDescription)")
}
let exportSession = AVAssetExportSession(asset: composition, presetName: AVAssetExportPresetHighestQuality)
exportSession.outputFileType = AVFileTypeMPEG4
exportSession.outputURL = outputURL
let start = CMTimeMake(0, 1)
let range = CMTimeRangeMake(start, composition.duration)
//exportSession.timeRange = range
exportSession.exportAsynchronouslyWithCompletionHandler {() -> Void in
switch exportSession.status {
case .Completed:
self.fileSystemHelper.copyFileAtURL(outputURL, toURL: finalURL)
self.appendURL = nil
// self.isRecording = false
completion()
case .Failed:
println("fail error - \(exportSession.error.localizedDescription)")
self.fileSystemHelper.removeFileAtURL(outputURL)
self.appendURL = nil
//self.isRecording = false
println("failed to mix")
// delegate?.videoCaptureDidFinishRecordingVideoAtURL(URL, appended: appendURL == nil)
default:
println("something else happened, check code")
}
}
могли бы вы рассказать немного больше о _ ", поэтому тест и посмотреть, что является наилучшим возможным разрешением, обе камеры имеют на устройстве и установите предустановку к нему не напрямую к AVCaptureSessionPresetHigh. "_? Заранее спасибо. – Unheilig
Это означает, что вы проверите, какая из них является самой высокой константой AVCaptureSessionPreset, которая включает в себя определенное разрешение, поддерживается обоими объектами AVCaptureDevice, представляющими переднюю и заднюю камеру устройства. И установите это как предустановку, которую вы будете использовать для захвата видео, таким образом, чтобы кадры, сделанные любым устройством, были одного размера. –
Другие слова - используйте тот, который является самым высоким с одного из двух устройств? Для меня непонятно, что это - _ "установить пресет для него не непосредственно в AVCaptureSessionPresetHigh." _. Еще раз спасибо. – Unheilig