Это прослушивание меня в последний день, я использовал этот метод в 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)
}
}
Не могли бы вы рассказать о решении и/или показать рабочий код? – riverhawk
После того, как объект был сохранен, и вам был предоставлен путь для него, вы не можете его переопределить. Поэтому, когда я попытался сохранить этот кусок кода, я попытался сохранить новое отредактированное видео по тому же пути, что и оригинал, который вышел из строя, потому что по умолчанию Apple не позволит вам переопределить его. Значит, мне нужно было сохранить видео на новом уникальном пути? Я могу предоставить клип кода, который создает уникальные пути для активов, если вам нравится? – bevbomb
Ahh имеет смысл! и мне бы понравился клип кода, если бы вы не возражали :) – riverhawk