2015-05-20 1 views
0

Я использую хорошо известный 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") 
     } 
    } 

ответ

0

Я нашел ответ самого по ночной прогулке по окрестностям только после того, как я задал этот вопрос :) Так что разные камеры имеют разное максимально возможное постановление, таким образом, продуцирующие кадры с различными размерами, что сбивает с толком композиционный объект. Он использует размер первого видео и игнорирует кадры видео другого размера. Итак, проверьте и посмотрите, какое наилучшее разрешение AVCaptureSessionPreset поддерживается обоими камерами на определенном устройстве. Затем используйте этот пресет в коде видеозахвата и не переходите напрямую к использованию AVCaptureSessionPresetHigh.

Я надеюсь, что это помогает другим людям тоже :)

+0

могли бы вы рассказать немного больше о _ ", поэтому тест и посмотреть, что является наилучшим возможным разрешением, обе камеры имеют на устройстве и установите предустановку к нему не напрямую к AVCaptureSessionPresetHigh. "_? Заранее спасибо. – Unheilig

+0

Это означает, что вы проверите, какая из них является самой высокой константой AVCaptureSessionPreset, которая включает в себя определенное разрешение, поддерживается обоими объектами AVCaptureDevice, представляющими переднюю и заднюю камеру устройства. И установите это как предустановку, которую вы будете использовать для захвата видео, таким образом, чтобы кадры, сделанные любым устройством, были одного размера. –

+0

Другие слова - используйте тот, который является самым высоким с одного из двух устройств? Для меня непонятно, что это - _ "установить пресет для него не непосредственно в AVCaptureSessionPresetHigh." _. Еще раз спасибо. – Unheilig

Смежные вопросы