【问题标题】:Swift, load video of the gallery without compressionSwift,无需压缩即可加载图库的视频
【发布时间】:2020-03-10 13:50:50
【问题描述】:

如果您允许用户使用之前在 iPhone 库中注册的带有 UIImagePickerController 的视频,则无论原始分辨率如何,它都会被导入并压缩为 1280x720。是否可以使用UIImagePickerController 以原始质量获得原始视频?

UIImagePickerController.InfoKey.mediaURL返回的url好像是压缩文件的临时url,无法获取原文件。

【问题讨论】:

    标签: ios swift uiimagepickercontroller


    【解决方案1】:

    我可以想到两种方法来解决这个问题。首先,UIImagePickerController 的属性称为videoExportPreset。您可以将该属性设置为AVAssetExportPresetPassthrough

    videoExportPreset 可用于指定转码质量 视频(通过 AVAssetExportPreset* 字符串)。如果值为 nil( 默认),则 transcodeQuality 由 videoQuality 确定 反而。如果源类型是无效的 UIImagePickerControllerSourceTypeCamera.

    记得做import AVFoundation


    第二种方法是实现自己的选择器,即使用PHAsset

    例子:

     let fetchResult = PHAsset.fetchAssets(with: .video, options: nil)
    
     let videoRequestOptions = PHVideoRequestOptions()
     videoRequestOptions.version = .original
    
     fetchResult.enumerateObjects { (asset, index, _) in
         PHImageManager.default().requestAVAsset(forVideo: asset, options: videoRequestOptions) { (avAsset, audioMix, infoDic) in
             //----
         }
     }
    

    【讨论】:

    • 我没有看到videoExportPreset 属性,谢谢!
    【解决方案2】:

    您可以根据需要设置AVCaptureSession.Preset。

    var session: AVCaptureSession?
    
    func video(){
    
            // Don't trigger camera access for the background
        guard AVCaptureDevice.authorizationStatus(for: AVMediaType.video) == .authorized else {
            return
        }
    
        do {
            // Prepare avcapture session
            session = AVCaptureSession()
            session?.sessionPreset = AVCaptureSession.Preset.high //medium or low
    
            // Hook upp device
            let device = AVCaptureDevice.default(for: AVMediaType.video)
            let input = try AVCaptureDeviceInput(device: device!)
            session?.addInput(input)
    
            // Setup capture layer
    
            guard session != nil else {
                return
            }
    
            let captureLayer = AVCaptureVideoPreviewLayer(session: session!)
            captureLayer.frame = bounds
            captureLayer.videoGravity = AVLayerVideoGravity.resizeAspectFill
            cameraBackground.layer.addSublayer(captureLayer)
    
            self.captureLayer = captureLayer
        } catch {
            session = nil
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-21
      • 2018-02-27
      • 2020-08-10
      • 1970-01-01
      • 2012-10-20
      • 1970-01-01
      相关资源
      最近更新 更多