Square cropping and fixing the video orientation in iOS

前端 未结 3 817
小鲜肉
小鲜肉 2020-12-23 23:55

I am capturing the video using UIImagePickerController, i can crop the video using the following code,

AVAsset *asset = [AVAsset assetWithURL:url];

//create         


        
3条回答
  •  悲哀的现实
    2020-12-24 00:10

    This is my code to create a vine-like video from a video on disk. This is written in swift:

    static let MaxDuration: CMTimeValue = 12
    
    class func compressVideoAsset(_ asset: AVAsset, output: URL, completion: @escaping (_ data: Data?) -> Void)
    {
        let session = AVAssetExportSession(asset: asset, presetName: AVAssetExportPresetMediumQuality)!
        session.videoComposition = self.squareVideoCompositionForAsset(asset)
        session.outputURL = output
        session.outputFileType = AVFileTypeMPEG4
        session.shouldOptimizeForNetworkUse = true
        session.canPerformMultiplePassesOverSourceMediaData = true
    
        let duration = CMTimeValue(CGFloat(asset.duration.value) / CGFloat(asset.duration.timescale) * 30)
        session.timeRange = CMTimeRange(start: kCMTimeZero, duration: CMTime(value: min(duration, VideoCompressor.MaxDuration * 30), timescale: 30))
    
        session.exportAsynchronously(completionHandler: { () -> Void in
            let data = try? Data(contentsOf: output)
    
            DispatchQueue.main.async(execute: { () -> Void in
                completion(data)
            })
        })
    }
    
    private class func squareVideoCompositionForAsset(_ asset: AVAsset) -> AVVideoComposition
    {
        let track = asset.tracks(withMediaType: AVMediaTypeVideo)[0]
        let length = min(track.naturalSize.width, track.naturalSize.height)
    
        var transform = track.preferredTransform
    
        let size = track.naturalSize
        let scale: CGFloat = (transform.a == -1 && transform.b == 0 && transform.c == 0 && transform.d == -1) ? -1 : 1 // check for inversion
    
        transform = transform.translatedBy(x: scale * -(size.width - length) / 2, y: scale * -(size.height - length) / 2)
    
        let transformer = AVMutableVideoCompositionLayerInstruction(assetTrack: track)
        transformer.setTransform(transform, at: kCMTimeZero)
    
        let instruction = AVMutableVideoCompositionInstruction()
        instruction.timeRange = CMTimeRange(start: kCMTimeZero, duration: kCMTimePositiveInfinity)
        instruction.layerInstructions = [transformer]
    
        let composition = AVMutableVideoComposition()
        composition.frameDuration = CMTime(value: 1, timescale: 30)
        composition.renderSize = CGSize(width: length, height: length)
        composition.instructions = [instruction]
    
        return composition
    }
    

提交回复
热议问题