我想使用下面的代码为电影添加边框,它在iPad2(7.1)上运行良好,但它无法在iPhone 6(8.1)上运行。 AVAssetExporterSession返回状态未完成,有什么问题吗?
func addBorderToVideo(composition: AVMutableVideoComposition, size: CGSize){
var borderImage = imageWithColor(UIColor.greenColor(), imageSize: CGRectMake(0, 0, size.width, size.height))
var backgrouondLayer = CALayer()
backgrouondLayer.contents = borderImage
backgrouondLayer.frame = CGRectMake(0, 0, size.width, size.height)
backgrouondLayer.masksToBounds = true
var videoLayer = CALayer()
videoLayer.frame = CGRectMake(cropSize, cropSize, size.width - cropSize, size.width - cropSize)
var parentLayer = CALayer()
parentLayer.frame = CGRectMake(0, 0, size.width, size.height)
parentLayer.addSublayer(backgrouondLayer)
parentLayer.addSublayer(videoLayer)
composition.animationTool = AVVideoCompositionCoreAnimationTool(postProcessingAsVideoLayer: videoLayer, inLayer: parentLayer)
}
func exportVideo()
{
//add videoTrack
var mixComposition = AVMutableComposition()
var videoTrack = mixComposition.addMutableTrackWithMediaType(AVMediaTypeVideo, preferredTrackID: CMPersistentTrackID(kCMPersistentTrackID_Invalid))
videoTrack.insertTimeRange(CMTimeRangeMake(kCMTimeZero, self.videoAsset.duration), ofTrack: self.videoAsset.tracksWithMediaType(AVMediaTypeVideo)[0] as AVAssetTrack, atTime: kCMTimeZero, error: nil)
//add layerInstructions
var mainInstruction = AVMutableVideoCompositionInstruction()
var videoLayerInstruction = AVMutableVideoCompositionLayerInstruction(assetTrack: videoTrack)
mainInstruction.timeRange = CMTimeRangeMake(kCMTimeZero, self.videoAsset.duration)
mainInstruction.layerInstructions = NSArray(object: videoLayerInstruction)
//add mainInstructions
var mainCompositionInst = AVMutableVideoComposition()
mainCompositionInst.renderSize = videoTrack.naturalSize
mainCompositionInst.instructions = NSArray(object: mainInstruction)
mainCompositionInst.frameDuration = CMTimeMake(1, 30)
// appley效果 self.addBorderToVideo(mainCompositionInst,size:videoTrack.naturalSize)
// get path
var paths = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)
var documentsDirectory = paths[0] as String
var myPathDocs = documentsDirectory.stringByAppendingPathComponent(NSString(format: "FinalVideo-%d.mp4", arc4random()%1000))
var url = NSURL.fileURLWithPath(myPathDocs)!
//create exporter
var exporter = AVAssetExportSession(asset: mixComposition, presetName: AVAssetExportPresetHighestQuality)
exporter.outputURL = url
exporter.outputFileType = AVFileTypeMPEG4
exporter.shouldOptimizeForNetworkUse = true
exporter.videoComposition = mainCompositionInst
exporter.exportAsynchronouslyWithCompletionHandler { () -> Void in
if exporter.status == AVAssetExportSessionStatus.Completed
{
var library = ALAssetsLibrary()
library.writeVideoAtPathToSavedPhotosAlbum(url, completionBlock: { (assetURL, error) -> Void in
var alert = UIAlertView(title: "Ok", message: "Movie Saved", delegate: nil, cancelButtonTitle: "OK")
alert.show()
})
}
else
{
var alert = UIAlertView(title: "Error", message: "something is wrong", delegate: nil, cancelButtonTitle: "OK")
alert.show()
}
}
}