美文网首页
UIImagePickerController 选择视频 拍视频

UIImagePickerController 选择视频 拍视频

作者: _风雨 | 来源:发表于2021-09-26 16:32 被阅读0次
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)
    }
}

相关文章

网友评论

      本文标题:UIImagePickerController 选择视频 拍视频

      本文链接:https://www.haomeiwen.com/subject/phnqnltx.html