簡體   English   中英

無法從圖庫中的視頻生成縮略圖

[英]Unable to generate thumbnail from video in gallery

我正在向用戶顯示一個圖像選擇器到 select 來自畫廊的視頻。 那行得通,我通過了媒體類型 ["public.movie"] 並且畫廊的所有視頻都顯示出來以供拾取。 當用戶選擇它時,我會在我的代表中收到:

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

生成縮略圖的function為:

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
    }
}

在控制台中顯示的視頻 url 是:

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,我需要一個絕對文件路徑或類似的東西。

使用UIImagePickerController.InfoKey.mediaURL鍵入信息字典。 UIImagePickerController.InfoKey.referenceURL棄用

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)
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM