swift - 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)
}
}
}
解决方案
推荐阅读
- android - 任务 ':app:packageDebug' 执行失败。> 获取条目压缩信息失败
- postgresql - Perl 控制台:基本命令和 fe_sendauth:没有密码不起作用
- r - 为每组重复数据在具有可变长度的数据框中生成日期序列
- sql - 如何进行查询以根据需要选择数据
- python - 将值关联到 .txt 文件中的变量 (Python)
- swift - 使用 alamofire 获取项目并快速将其传递给 tableview
- c++ - C ++链表中出现垃圾节点
- c# - 使用 .Net Compact/Windows CE 从线程中的数据设置标签文本
- java - 搜索 Java 数组,在第一个实例后停止
- stream - 返回 Stream trait 对象的 Future