extension LXPublishController: UIImagePickerControllerDelegate, UINavigationControllerDelegate {
func canShooting() -> Bool {
return UIImagePickerController.isSourceTypeAvailable(UIImagePickerController.SourceType.camera)
}
func chosseVideo() {
let imagePicker = UIImagePickerController().then {
$0.sourceType = .photoLibrary
$0.mediaTypes = ["public.movie"]
$0.delegate = self
$0.allowsEditing = true
}
present(imagePicker, animated: true) {
}
}
func shootVideo() {
let imagePicker = UIImagePickerController().then {
$0.sourceType = .camera
$0.mediaTypes = ["public.movie"]
$0.cameraFlashMode = .off
$0.videoMaximumDuration = 15.0
$0.videoQuality = .typeIFrame1280x720
$0.cameraCaptureMode = .video
$0.delegate = self
$0.allowsEditing = true
}
present(imagePicker, animated: true) {
}
}
func imagePickerControllerDidCancel(_ picker: UIImagePickerController) {
picker.dismiss(animated: true, completion: nil)
}
func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {
picker.dismiss(animated: true, completion: nil)
if let inputUrl = info[UIImagePickerController.InfoKey.mediaURL] as? URL {
let uuid = UUID().uuidString
let formatter = DateFormatter()
formatter.dateFormat = "yyyy-MM-ddHH:mm:ss"
let fileName = uuid + formatter.string(from: Date())
let documentsURL = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)[0]
let fileURL = documentsURL.appendingPathComponent("Video/\(fileName).mp4")
do {
try FileManager.default.createDirectory(at: fileURL, withIntermediateDirectories: true)
} catch {
printl(message: "create video directory failed")
return
}
videoTargetUrl = fileURL
encodeVideo(inputUrl: inputUrl, outputUrl: fileURL)
}
}
func encodeVideo(inputUrl: URL, outputUrl: URL) {
let avAsset = AVURLAsset(url: inputUrl)
let startDate = Date()
guard let exportSession = AVAssetExportSession(asset: avAsset, presetName: AVAssetExportPreset1280x720) else {
printl(message: "失败")
return
}
deleteFile(outputUrl)
if FileManager.default.fileExists(atPath: outputUrl.path){
do{
try FileManager.default.removeItem(atPath: outputUrl.path)
}catch let error{
print(error)
}
}
exportSession.outputURL = outputUrl
exportSession.outputFileType = AVFileType.mp4
exportSession.shouldOptimizeForNetworkUse = true
let start = CMTimeMakeWithSeconds(0.0, preferredTimescale: 0)
let range = CMTimeRange(start: start, duration: avAsset.duration)
exportSession.timeRange = range
exportSession.exportAsynchronously{() -> Void in
switch exportSession.status{
case .failed:
print("\(String(describing: exportSession.error))")
case .cancelled:
print("Export cancelled")
case .completed:
let endDate = Date()
let time = endDate.timeIntervalSince(startDate)
print(time)
print("Successful")
print(exportSession.outputURL ?? "")
DispatchQueue.main.async {
guard let image = self.getFristImageFromVideo() else {
return
}
self.logoImageView.image = image
}
default:
break
}
}
}
func deleteFile(_ filePath:URL) {
guard FileManager.default.fileExists(atPath: filePath.path) else{
return
}
do {
try FileManager.default.removeItem(atPath: filePath.path)
}catch{
fatalError("Unable to delete file: \(error) : \(#function).")
}
}
//获取视频第一帧
func getFristImageFromVideo() -> UIImage? {
guard let url = videoTargetUrl else {
return nil
}
let asset = AVURLAsset(url: url)
let assetIG = AVAssetImageGenerator(asset: asset)
assetIG.appliesPreferredTrackTransform = true
assetIG.apertureMode = AVAssetImageGenerator.ApertureMode.encodedPixels
let cmTime = CMTime(seconds: 0, preferredTimescale: 1)
let thumbnailImageRef: CGImage
do {
thumbnailImageRef = try assetIG.copyCGImage(at: cmTime, actualTime: nil)
} catch let error {
print("Error: \(error)")
return nil
}
return UIImage(cgImage: thumbnailImageRef)
}
}
网友评论