首页 > 解决方案 > SwiftUI ImagePicker videoMaxduration Alert hidden

问题描述

我正在使用 SwiftUI 录制相机,当视频最长持续时间结束时,会出现警报。我想关掉它。我正在使用 SwiftUI 录制相机,当视频最长持续时间结束时,会出现警报。我想关掉它。我该怎么做呢。此警告始终在屏幕上,我不会将其关闭 在此处输入图像描述

import MobileCoreServices
import AVFoundation
import SwiftUI
struct CevapGondermeEkraniPicker: UIViewControllerRepresentable {
    
    @Binding var showPicker : Bool
    @Binding var url: URL?
    @Binding var data : Data?
    var time : TimeInterval?
    @Binding var picker : UIImagePickerController
    var action : (Data)->Void
    func makeCoordinator() -> Coordinator {
        return Coordinator(showPicker: $showPicker, url: $url, data: $data, action: action)
    }
    
    func makeUIViewController(context: UIViewControllerRepresentableContext<CevapGondermeEkraniPicker>) -> UIImagePickerController {
        picker.allowsEditing = false
        if UIImagePickerController.isSourceTypeAvailable(.camera) {
                   picker.sourceType = .camera
               } else {
                   fatalError("Camera is not available, please use real device.")
               }
        picker.mediaTypes = [kUTTypeMovie as String]
        picker.cameraDevice = .front
        picker.videoQuality = .typeMedium
        picker.videoMaximumDuration = time ?? 0
        picker.allowsEditing = false
        picker.showsCameraControls  = false
        picker.delegate = context.coordinator
        return picker
    }

    func updateUIViewController(_ uiViewController: UIImagePickerController,
                                context: UIViewControllerRepresentableContext<CevapGondermeEkraniPicker>) {
        
    }
    
    
    class Coordinator: NSObject, UINavigationControllerDelegate, UIImagePickerControllerDelegate {
        @Binding var showPicker : Bool
        @Binding var url: URL?
        @Binding var data : Data?
        var action : (Data)->Void
        init(showPicker: Binding<Bool>, url: Binding<URL?>,data:Binding<Data?>, action : @escaping (Data)->Void) {
            _showPicker = showPicker
            _data = data
           _url = url
            self.action = action
        }
        
        func imagePickerController(_ picker: UIImagePickerController,
                                   didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {
            if let mediaType = info[.mediaType] as? String, mediaType == "public.movie" {
                url = info[.mediaURL] as? URL
                let pathString = url!.absoluteString
                let avAsset = AVURLAsset(url: url!, options: nil)
                self.data = NSData(contentsOf: self.url!) as Data?
                avAsset.exportVideo(presetName: AVAssetExportPresetHighestQuality, outputFileType: AVFileType.mp4, fileExtension: "mp4") { (mp4Url) in
                              self.url = mp4Url//videoURL//
                    if  UIVideoAtPathIsCompatibleWithSavedPhotosAlbum(pathString) {
                        UISaveVideoAtPathToSavedPhotosAlbum(self.url!.absoluteString, self,nil, nil)
                        /// sonradan eklendi
                            self.action((NSData(contentsOf: self.url!) as Data?)!)
                    }else{
                        return
                    }
                }
                 
            }
            self.showPicker = false
            func didSaveVideo(videoPath: String, error: NSError, contextInfo: Any) {
            }
            
        }
        
        func imagePickerControllerDidCancel(_ picker: UIImagePickerController) {
            self.showPicker = false
        }
        
        
    }

    
}

func compressVideo(inputURL: URL, outputURL: URL, handler:@escaping (_ exportSession: AVAssetExportSession?)-> Void) {
    let urlAsset = AVURLAsset(url: inputURL, options: nil)
    guard let exportSession = AVAssetExportSession(asset: urlAsset, presetName: AVAssetExportPresetMediumQuality) else {
        handler(nil)
        
        return
    }
    
    exportSession.outputURL = outputURL
    exportSession.outputFileType = AVFileType.mp4
    exportSession.shouldOptimizeForNetworkUse = true
    exportSession.exportAsynchronously { () -> Void in
        handler(exportSession)
    }
}


extension AVURLAsset
{
    func exportVideo(presetName: String = AVAssetExportPresetHighestQuality, outputFileType: AVFileType = .mp4, fileExtension: String = "mp4", then completion: @escaping (URL?) -> Void)
    {
        let filename = url.deletingPathExtension().appendingPathExtension(fileExtension).lastPathComponent
        let outputURL = FileManager.default.temporaryDirectory.appendingPathComponent(filename)

    if let session = AVAssetExportSession(asset: self, presetName: presetName) {
        session.outputURL = outputURL
        session.outputFileType = outputFileType
        let start = CMTimeMakeWithSeconds(0.0, preferredTimescale: 0)
        let range = CMTimeRangeMake(start: start, duration: duration)
        session.timeRange = range
        session.shouldOptimizeForNetworkUse = true
        session.exportAsynchronously {
            switch session.status {
            case .completed:
                completion(outputURL)
            case .cancelled:
                debugPrint("Video export cancelled.")
                completion(nil)
            case .failed:
                let errorMessage = session.error?.localizedDescription ?? "n/a"
                debugPrint("Video export failed with error: \(errorMessage)")
                completion(nil)
            default:
                break
            }
        }
    } else {
        completion(nil)
    }
}
}

标签: swiftswiftuiuiimagepickercontroller

解决方案


推荐阅读