FGVideoEditor

swif版微信视屏裁剪,类似微信朋友圈视频裁剪方式的视频裁剪工具(video croping)

MIT License

Stars
116
Committers
4

FGVideoEditor

  • UI

Feathures

GIF


Vedio

Usage

(Simply use follow interface to crop a video in WeChat-style-lkie)

public convenience init(maxDuration:CGFloat, vedio url:URL, finishHandler:((FGVideoPreViewController, FGVideoInfo) -> ())?)

UI(or just using crop function)

public func cropVideo(url: URL, cropRange:CMTimeRange, completion:((_ newUrl: URL, _ newDuration:CGFloat,_ result:Bool) -> ())?)

UI(or just WeChat-style video croping UI)

public convenience init(frame: CGRect, url:URL, imgw:CGFloat, maxduration:CGFloat)
var cropStart:CGFloat //0s
var cropDuration:CGFloat //
var cropRange:CMTimeRange //CMTime
var cropWidth:CGFloat //
var slidingBeginHandler:(() -> ())?  //
var slidingHandler:((FGSlideDirection) -> ())?  //
var slidingEndHandler:(() -> ())? //
var contentDidScrollHandler:(() -> ())? //
var dragWillBeginHandler:(() -> ())?  //
var dragDidEndHandler:(() -> ())?  //

shouldSaveCropedVideoToPhotoLibrarytrue (save croped video to photo library. default is true, set false to disable auto save to photo library)

(Example)

let picker = UIImagePickerController.init()
picker.sourceType = .photoLibrary
picker.mediaTypes = [kUTTypeMovie as String]
picker.delegate = wkself
picker.allowsEditing = false
present(picker, animated: true, completion: nil)

func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {
    guard let url = info[UIImagePickerControllerMediaURL] as? URL else {
        picker.dismiss(animated: true, completion: nil)
        showHUD(.error(""))
        return
    }
    crop(video: url)
    picker.dismiss(animated: true, completion: nil)
}

(croping and ui)

private func crop(video url:URL) {
    weak var wkself = self
    let preview = FGVideoPreViewController.init(max: 10, vedio: url) { (edit, info) in
        wkself?.cropedUrl = info.url
        wkself?.navigationController?.popViewController(animated: true)
        wkself?.playCropedVideo()
    }
    navigationController?.pushViewController(preview, animated: true)
}

private func playCropedVideo() {
    guard let url = cropedUrl else {
        return
    }
    pickBtn.isHidden = true
    
    player = AVPlayer.init(url: url)
    previewLayer = AVPlayerLayer.init(player: player)
    previewLayer?.backgroundColor = UIColor.clear.cgColor
    previewLayer?.videoGravity = .resizeAspectFill
    previewLayer?.frame = view.bounds
    view.layer.insertSublayer(previewLayer!, at: 0)
    player?.play()
}

(croping only)

FGVideoEditor.shared.cropVideo(url: url, cropRange: range, completion: { (newUrl, newDuration, result) in
    guard result else {
        self.showHUD(.error(""))
        return
    }
    print(":\(newUrl):%.1f",newDuration)
})

UI(ui only)

let editFrame = CGRect.init(x: 50, y: screenheight - 100, width: screenwidth - 100, height: 50)
slider = FGVideoEditSliderView.init(frame: editFrame, url: url, imgw: imgw, maxduration: 10)
view.addSubview(slider)
weak var wkself = self
slider.slidingBeginHandler = {
    wkself?.player?.pause()
    wkself?.playing = false
}
let tolerance = CMTimeMake(1, timesclae)
slider.slidingHandler = { (direction) in
    let range = (wkself ?? self).slider.cropRange
    wkself?.currentRange = range
    if direction == .left {
        wkself?.player?.seek(to: range.end)
    } else {
        wkself?.player?.seek(to: range.start,
                             toleranceBefore: tolerance,
                             toleranceAfter: tolerance)
        wkself?.player?.seek(to: range.start)
    }
}
slider.slidingEndHandler = {
    wkself?.player?.seek(to: (wkself ?? self).currentRange.start)
    wkself?.player?.play()
    wkself?.playing = true
}
slider.contentDidScrollHandler = {
    let range = (wkself ?? self).slider.cropRange
    wkself?.currentRange = range
    wkself?.player?.seek(to: range.start)
}
slider.dragWillBeginHandler = {
    wkself?.player?.pause()
    wkself?.playing = false
}
slider.dragDidEndHandler = {
    wkself?.player?.play()
    wkself?.playing = true
}

Installation

pod repo update
pod "FGVideoEditor", "~>1.2.1"

import FGVideoEditor

****"SnapKit", "FGHUD", `"pod "FGToolKit"

Required

  • Xocde 9
  • Swift 4.x

star pull requestisuue

Package Rankings
Top 16.1% on Cocoapods.org
Badges
Extracted from project README's
Version License Platform
Related Projects