2015-03-19 4 views
2

Это прослушивание меня в последний день, я использовал этот метод в ObjC, чтобы обрезать видео в квадрат, это, кажется, единственный метод, который я нашел в нескольких лет, которые работали, но после того, как в последнее время пытались обрезать его с помощью Swift & iOS 8, похоже, что он не обрезает видео вообще, надеюсь кто-нибудь может помочь?Обрезание AVAsset видео с AVFoundation не работает iOS 8

func captureOutput(captureOutput: AVCaptureFileOutput!, didFinishRecordingToOutputFileAtURL outputFileURL: NSURL!, fromConnections connections: [AnyObject]!, error: NSError!) { 
    if error != nil { 
     println("Error Outputting recording") 
    } else { 
     self.writeVideoToAssetsLibrary(self.outputUrl!.copy() as NSURL) 
    } 
} 

func writeVideoToAssetsLibrary(videoUrl: NSURL) { 
    var videoAsset: AVAsset = AVAsset.assetWithURL(videoUrl) as AVAsset 

    var clipVideoTrack = videoAsset.tracksWithMediaType(AVMediaTypeVideo).first as AVAssetTrack 

    var composition = AVMutableComposition() 
    composition.addMutableTrackWithMediaType(AVMediaTypeVideo, preferredTrackID: CMPersistentTrackID()) 

    var videoComposition = AVMutableVideoComposition() 

    videoComposition.renderSize = CGSizeMake(clipVideoTrack.naturalSize.height, clipVideoTrack.naturalSize.height) 
    videoComposition.frameDuration = CMTimeMake(1, 30) 


    var transformer = AVMutableVideoCompositionLayerInstruction(assetTrack: clipVideoTrack) 

    var instruction = AVMutableVideoCompositionInstruction() 
    instruction.timeRange = CMTimeRangeMake(kCMTimeZero, CMTimeMakeWithSeconds(60, 30)) 

    var transform1: CGAffineTransform = CGAffineTransformMakeTranslation(clipVideoTrack.naturalSize.height, (clipVideoTrack.naturalSize.width - clipVideoTrack.naturalSize.height)/2) 
    var transform2 = CGAffineTransformRotate(transform1, CGFloat(M_PI_2)) 
    var finalTransform = transform2 


    transformer.setTransform(finalTransform, atTime: kCMTimeZero) 

    instruction.layerInstructions = [transformer] 
    videoComposition.instructions = [instruction] 

    var exporter = AVAssetExportSession(asset: videoAsset, presetName: AVAssetExportPresetHighestQuality) 
    exporter.videoComposition = videoComposition 
    exporter.outputURL = videoUrl 
    exporter.outputFileType = AVFileTypeQuickTimeMovie 

    exporter.exportAsynchronouslyWithCompletionHandler({() -> Void in 
     dispatch_async(dispatch_get_main_queue(), { 
      self.handleExportCompletion(exporter) 
     }) 
    }) 
} 

func handleExportCompletion(session: AVAssetExportSession) { 
    var library = ALAssetsLibrary() 

    if library.videoAtPathIsCompatibleWithSavedPhotosAlbum(session.outputURL) { 
     var completionBlock: ALAssetsLibraryWriteVideoCompletionBlock 

     completionBlock = { assetUrl, error in 
      if error != nil { 
       println("error writing to disk") 
      } else { 

      } 
     } 

     library.writeVideoAtPathToSavedPhotosAlbum(outputUrl, completionBlock: completionBlock) 
    } 
} 

ответ

4

Так получается, что если вы попробуйте установить outputUrl экспортера к таким же, как актив вашего редактирования, как я сделал это Безразлично Не редактируй, так глупо! поэтому для будущих ссылок outputUrl должен быть установлен на новый уникальный номер

+0

Не могли бы вы рассказать о решении и/или показать рабочий код? – riverhawk

+2

После того, как объект был сохранен, и вам был предоставлен путь для него, вы не можете его переопределить. Поэтому, когда я попытался сохранить этот кусок кода, я попытался сохранить новое отредактированное видео по тому же пути, что и оригинал, который вышел из строя, потому что по умолчанию Apple не позволит вам переопределить его. Значит, мне нужно было сохранить видео на новом уникальном пути? Я могу предоставить клип кода, который создает уникальные пути для активов, если вам нравится? – bevbomb

+0

Ahh имеет смысл! и мне бы понравился клип кода, если бы вы не возражали :) – riverhawk

0

Я не могу дать вам точный ответ, потому что я использую C# (Xamarin) для программирования iOS. Но я использую setCropRectangle для обрезки видео. В C# это выглядит следующим образом:

layerInstruction.SetCrop (new CGRect (_cropMove, 0, _width/2, height), transformTime); 

Посмотрите на документацию: setCropRectangle

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