【问题标题】:Record crop video square aspect ratio AVCaptureSession录制裁剪视频正方形长宽比 AVCaptureSession
【发布时间】:2019-04-08 11:30:48
【问题描述】:

如何使用 AVCaptureSession 录制方形视频?如果录制时无法实现,那我以后如何在didFinishRecordingTo委托方法中裁剪它?

提前致谢!

【问题讨论】:

    标签: ios swift avfoundation avcapturesession avcapturedevice


    【解决方案1】:

    您可以使用此演示代码录制方形视频:https://github.com/DarshanRlogical/DKCustomCamera

    您可以使用以下方法裁剪视频:

    func manageCroppingToSquare(filePath: URL , completion: @escaping (_ outputURL : URL?) -> ()) {
        
        // output file
        let documentsURL = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first
        let outputPath = documentsURL?.appendingPathComponent("squareVideo.mov")
        if FileManager.default.fileExists(atPath: (outputPath?.path)!) {
            do {
               try FileManager.default.removeItem(atPath: (outputPath?.path)!)
            }
            catch {
                print ("Error deleting file")
            }
        }
        
        //input file
        let asset = AVAsset.init(url: filePath)
        print (asset)
        let composition = AVMutableComposition.init()
        composition.addMutableTrack(withMediaType: AVMediaTypeVideo, preferredTrackID: kCMPersistentTrackID_Invalid)
        
        //input clip
        let clipVideoTrack = asset.tracks(withMediaType: AVMediaTypeVideo)[0]
        
        //make it square
        let videoComposition = AVMutableVideoComposition()
        videoComposition.renderSize = CGSize(width: CGFloat(clipVideoTrack.naturalSize.height), height: CGFloat(clipVideoTrack.naturalSize.height))
        videoComposition.frameDuration = CMTimeMake(1, 30)
        let instruction = AVMutableVideoCompositionInstruction()
        instruction.timeRange = CMTimeRangeMake(kCMTimeZero, CMTimeMakeWithSeconds(60, 30))
        
        //rotate to potrait
        let transformer = AVMutableVideoCompositionLayerInstruction(assetTrack: clipVideoTrack)
        let t1 = CGAffineTransform(translationX: clipVideoTrack.naturalSize.height, y: -(clipVideoTrack.naturalSize.width - clipVideoTrack.naturalSize.height) / 2)
        let t2: CGAffineTransform = t1.rotated(by: .pi/2)
        let finalTransform: CGAffineTransform = t2
        transformer.setTransform(finalTransform, at: kCMTimeZero)
        instruction.layerInstructions = [transformer]
        videoComposition.instructions = [instruction]
        
        //exporter 
        let exporter = AVAssetExportSession.init(asset: asset, presetName: AVAssetExportPresetMediumQuality)
        exporter?.outputFileType = AVFileTypeQuickTimeMovie
        exporter?.outputURL = outputPath
        exporter?.videoComposition = videoComposition
        
        exporter?.exportAsynchronously() { handler -> Void in
            if exporter?.status == .completed {
                print("Export complete")
                DispatchQueue.main.async(execute: {
                    completion(outputPath)
                })
                return
            } else if exporter?.status == .failed {
                print("Export failed - \(String(describing: exporter?.error))")
            }
            completion(nil)
            return
        }
    }
    

    我希望这段代码对你有用。

    【讨论】:

    • 感谢您的回答!我会对其进行测试并返回答案。
    • 当然可以,但是请对我的帖子做同样的事情,因为有人给我投了反对票,不知道为什么。
    • 该库是从资源中打开视频并修改渲染设置,它不是记录相机库
    • @famfamfam 我已经更新了网址,现在检查。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-11-05
    • 1970-01-01
    • 1970-01-01
    • 2017-08-16
    • 2012-05-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多