简体   繁体   English

如何从Swift中的UIPickerViewController中获取视频的缩略图?

[英]How to get thumbnail image of video picked from UIPickerViewController in Swift?

This is how I access the video: 这就是我访问视频的方式:

func imagePickerController(picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [NSObject : AnyObject]) {

    if let videoURL = info[UIImagePickerControllerMediaURL] as? NSURL {
        let video = NSData(contentsOfURL: videoURL)
    }
}

That video I would like to show the user in my controller (I do not mean UIDocumentInteractionController to preview this). 那个video我想在我的控制器中显示用户(我不是指UIDocumentInteractionController来预览这个)。 I need a thumbnail of that video, and then assign this to UIImageView . 我需要该视频的缩略图,然后将其分配给UIImageView Is it possible? 可能吗?

The simplest answer: 最简单的答案:

import AVFoundation

private func thumbnailForVideoAtURL(url: NSURL) -> UIImage? {

    let asset = AVAsset(URL: url)
    let assetImageGenerator = AVAssetImageGenerator(asset: asset)

    var time = asset.duration
    time.value = min(time.value, 2)

    do {
        let imageRef = try assetImageGenerator.copyCGImageAtTime(time, actualTime: nil)
        return UIImage(CGImage: imageRef)
    } catch {
        print("error")
        return nil
    }
}

Here's SWIFT 3.0 using extension 这是使用扩展的SWIFT 3.0

import Foundation
import UIKit
import MediaPlayer

import SystemConfiguration

extension AVAsset{
    var videoThumbnail:UIImage?{

        let assetImageGenerator = AVAssetImageGenerator(asset: self)
        assetImageGenerator.appliesPreferredTrackTransform = true

        var time = self.duration
        time.value = min(time.value, 2)

        do {
            let imageRef = try assetImageGenerator.copyCGImage(at: time, actualTime: nil)
            let thumbNail = UIImage.init(cgImage: imageRef)


            print("Video Thumbnail genertated successfuly".DubugSuccess())

            return thumbNail

        } catch {

            print("error getting thumbnail video".DubugError(),error.localizedDescription)
            return nil


        }

    }
}

Then simply from anywhere you have access to AVAsset/URL : 然后,只需从您有权访问AVAsset / URL的任何地方:

func imagePickerController(picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [NSObject : AnyObject]) {

    if let videoURL = info[UIImagePickerControllerMediaURL] as? NSURL {
        let video = NSData(contentsOfURL: videoURL)

        //Create AVAsset from url
        let ass = AVAsset(url:videoURL)

        if let videoThumbnail = ass.videoThumbnail{
          print("Success")
        }
    }
}

You can generate a thumbnail with this method: 您可以使用此方法生成缩略图:

import AVFoundation

func generateThumnail(url : NSURL) -> UIImage?{
    let asset: AVAsset = AVAsset(URL: url)
    let assetImgGenerate : AVAssetImageGenerator = AVAssetImageGenerator(asset: asset)
    assetImgGenerate.appliesPreferredTrackTransform = true
    let time        : CMTime = CMTimeMake(1, 30)
    let img         : CGImageRef
    do {
        try img = assetImgGenerate.copyCGImageAtTime(time, actualTime: nil)
        let frameImg: UIImage = UIImage(CGImage: img)
        return frameImg
    } catch {

    }
    return nil
}

Answer for AiOsN and the way how to fix image rotation. 回答AiOsN以及如何修复图像旋转的方法。 You just need to change this line of code: 您只需要更改以下代码行:

return UIImage(CGImage: imageRef)

to this one: 到这一个:

return UIImage(CGImage: imageRef scale: 1.0 , orientation: UIImageOrientation.Right)

and the image will show you correct rotation. 并且图像将显示正确的旋转。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM