(Cocoa error -1)尝试保存使用AVCaptureSession创建的视频时

时间:2016-02-20 10:52:06

标签: swift avassetexportsession avcapture

我正在使用AVCapture会话生成视频,然后使用AVVideoCompositionCoreAnimationTool添加简单的叠加层。然后我使用AVAssetExportSession输出文件。这一切似乎都有效但当我尝试使用PHPhotoLibrary将其保存到照片库时(因为ALAssetsLibrary已被折旧)失败并显示消息:“无法完成操作可可错误-1”。经过广泛的谷歌使用和检查文档,我无法解决什么是错误的。

The problem

任何帮助都会非常感谢。

 func videoOutput() {


    videoToMake = AVAsset(URL: videoToMakeURL!)

    if (videoToMake == nil) {

        return
    }


    //This holds the different tracks of the video like audio and the layers
    let mixComposition = AVMutableComposition()

    let videoTrack = mixComposition.addMutableTrackWithMediaType(AVMediaTypeVideo, preferredTrackID: Int32(kCMPersistentTrackID_Invalid))

    print("The duration of the video to create is \(videoToMake!.duration.seconds)")

    do{
       try videoTrack.insertTimeRange(CMTimeRangeMake(kCMTimeZero,videoToMake!.duration), ofTrack: videoToMake!.tracksWithMediaType(AVMediaTypeVideo)[0], atTime: kCMTimeZero)
    }catch let error as NSError{
         print("Error inserting time range on video track \(error.localizedDescription)")
         return
    }catch{
        print("An unknown error occured")
    }

    //Make the instructions for the other layers
    let mainInstrucation = AVMutableVideoCompositionInstruction()
    mainInstrucation.timeRange = CMTimeRangeMake(kCMTimeZero, videoToMake!.duration)

    //Create the layer instructions
    let videoLayerInstruction = AVMutableVideoCompositionLayerInstruction(assetTrack: videoTrack)
    let videoAssetTrack = videoToMake!.tracksWithMediaType(AVMediaTypeVideo)[0]


    let assetInfo = orientationFromTransform(videoAssetTrack.preferredTransform)
    // sort size it in respect to the video orientation.

    videoLayerInstruction.setTransform(videoAssetTrack.preferredTransform, atTime: kCMTimeZero)
    videoLayerInstruction.setOpacity(0.0, atTime:videoToMake!.duration)

    //Add the instructions
    mainInstrucation.layerInstructions = [videoLayerInstruction]
    let mainCompositionInst = AVMutableVideoComposition()

    var naturalSize:CGSize
    if assetInfo.isPortrait {
        naturalSize = CGSizeMake(videoAssetTrack.naturalSize.height, videoAssetTrack.naturalSize.width);
    }else{
        naturalSize = videoAssetTrack.naturalSize
    }

    let renderWidth = naturalSize.width
    let renderHeight = naturalSize.height

    mainCompositionInst.renderSize = CGSizeMake(renderWidth, renderHeight)
    mainCompositionInst.instructions = [mainInstrucation]
    mainCompositionInst.frameDuration = CMTimeMake(1, 30);

    //So now the main composition has been created add the video affects
    applyVideoEffectsToComposition(mainCompositionInst, size: naturalSize)

    let paths = NSSearchPathForDirectoriesInDomains(.DocumentDirectory,.UserDomainMask, true)
    let documentsDirectory = paths[0]
    let random = Int(arc4random_uniform(1000))
    let url = NSURL(fileURLWithPath:documentsDirectory).URLByAppendingPathComponent("FinalVideo\(random)")

    //Create the exporter 
    let exporter = AVAssetExportSession(asset: mixComposition, presetName:AVAssetExportPresetHighestQuality)
    exporter!.outputURL = url
    exporter!.outputFileType = AVFileTypeMPEG4
    exporter!.shouldOptimizeForNetworkUse = true
    exporter!.videoComposition = mainCompositionInst

    //Perform the export
    exporter!.exportAsynchronouslyWithCompletionHandler() {
        dispatch_async(dispatch_get_main_queue(), { () -> Void in
           self.exportDidFinish(exporter!)
       })
    }
}

1 个答案:

答案 0 :(得分:3)

事实证明我错过了电影名称末尾的扩展名:

let url = NSURL(fileURLWithPath:documentsDirectory).URLByAppendingPathComponent("FinalVideo\(random)")

所以应该是" FinalVideo(随机).mov"

希望有一天能帮到某人。