【问题标题】:Unable to generate thumbnail from video in gallery无法从图库中的视频生成缩略图
【发布时间】:2022-01-01 11:44:55
【问题描述】:

我正在向用户显示一个图像选择器以从图库中选择一个视频。那行得通,我通过了媒体类型 ["public.movi​​e"] 并且画廊的所有视频都显示出来以供拾取。当用户选择它时,我会在我的代表中收到:

extension VNInventoryCollectionVC: UIImagePickerControllerDelegate {
    func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey: Any]) {
        let info = convertFromUIImagePickerControllerInfoKeyDictionary(info)
        if let pickedImage = info[convertFromUIImagePickerControllerInfoKey(UIImagePickerController.InfoKey.originalImage)] as? UIImage
        {
            pickImageCallback?(pickedImage)
        }
        if let videoURL = info["UIImagePickerControllerReferenceURL"] as? URL
        {
            print(videoURL)
            pickImageCallback?(videoURL)
        }
        dismiss(animated: true)
       
    }
}

回调后,我尝试从该视频创建图像缩略图,但这是我无法做到的:

let thumbnail = getThumbnailFrom(path: multimedia.video!)
cell.image.image = thumbnail

生成缩略图的函数是:

func getThumbnailFrom(path: URL) -> UIImage? {
    do {
        print("Video URL: \(path)")
        print("Video absolute URL: \(path.absoluteURL)")
        //let asset = AVURLAsset(url: path.absoluteURL! , options: nil)
        var asset : AVAsset = AVAsset(url: path.absoluteURL) as! AVAsset
        let imgGenerator = AVAssetImageGenerator(asset: asset)
        imgGenerator.appliesPreferredTrackTransform = true
        let cgImage = try imgGenerator.copyCGImage(at: CMTimeMake(value: 0, timescale: 1), actualTime: nil)
        let thumbnail = UIImage(cgImage: cgImage)

        return thumbnail

    } catch let error {
        print("*** Error generating thumbnail: \(error.localizedDescription)")
        return nil
    }
}

在控制台中显示的视频网址是:

Video URL: assets-library://asset/asset.MP4?id=84D1CEDD-7AE4-4FE5-897E-47608DC2CFF0&ext=MP4
Video absolute URL: assets-library://asset/asset.MP4?id=84D1CEDD-7AE4-4FE5-897E-47608DC2CFF0&ext=MP4

显示的错误是无法打开文件。中断的行是:

let cgImage = try imgGenerator.copyCGImage(at: CMTimeMake(value: 0, timescale: 1), actualTime: nil)

我想问题出在 url,我有一个资产 url,我需要一个绝对文件路径或类似的东西。

【问题讨论】:

    标签: ios swift video-thumbnails


    【解决方案1】:

    使用UIImagePickerController.InfoKey.mediaURL 键入信息字典。 UIImagePickerController.InfoKey.referenceURLdeprecated

    func didSelectVideo(at url: URL) {
        let asset = AVAsset(url: url)
        let generator = AVAssetImageGenerator(asset: asset)
        generator.appliesPreferredTrackTransform = true
        let cgImage = try! generator.copyCGImage(at: CMTimeMake(value: 0, timescale: 1), actualTime: nil)
        let thumbnail = UIImage(cgImage: cgImage)
        cell.image.image = thumbnail
    }
    
    func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {
        dismiss(animated: true) {
            guard let url = info[.mediaURL] as? URL else { return }
            self.didSelectVideo(at: url)
        }
    }
    

    【讨论】:

    • 嗨@Rob 谢谢,我适应了我的函数名称你的答案,但效果很好。谢谢!!
    猜你喜欢
    • 2017-02-16
    • 1970-01-01
    • 2019-05-06
    • 1970-01-01
    • 2013-10-22
    • 2012-09-01
    • 2017-03-01
    • 2011-07-04
    • 2011-02-19
    相关资源
    最近更新 更多