Swift, загрузи видео из галереи без сжатия - PullRequest
0 голосов
/ 10 марта 2020

Когда вы предлагаете пользователю использовать видео, ранее зарегистрированное в галерее iPhone с UIImagePickerController, оно импортируется и сжимается до 1280x720 независимо от исходного разрешения. Можно ли получить оригинальное видео в оригинальном качестве с UIImagePickerController?

URL-адрес, возвращаемый UIImagePickerController.InfoKey.mediaURL, кажется временным URL-адресом сжатого файла, поэтому его невозможно использовать для получения исходного файла.

Ответы [ 2 ]

1 голос
/ 10 марта 2020

Есть два способа решения этой проблемы. Во-первых, есть свойство 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
         //----
     }
 }
0 голосов
/ 10 марта 2020

вы можете установить 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
    }
}
...