iOS - How to get thumbnail from video without play?

后端 未结 8 1120
鱼传尺愫
鱼传尺愫 2020-12-16 00:36

I\'m trying to get thumbnail from video and show it in my tableview. Here is my code:

- (UIImage *)imageFromVideoURL:(NSURL *)contentURL {
    AVAsset *asse         


        
相关标签:
8条回答
  • 2020-12-16 00:41

    Swift 4 code for @Disha's answer:

    let imageGenerator = AVAssetImageGenerator(asset: avAsset)
                    let time = CMTime(seconds: seconds, preferredTimescale: 600)
                    let times = [NSValue(time: time)]
                    imageGenerator.generateCGImagesAsynchronously(forTimes: times, completionHandler: {
                        requestedTime, image, actualTime, result, error in
                        guard let cgImage = image else
                        {
                            print("No image!")
                            return
                        }
                        let uiImage = UIImage(cgImage: cgImage)
                        UIImageWriteToSavedPhotosAlbum(uiImage, nil, nil, nil);
                    })
    
    0 讨论(0)
  • 2020-12-16 00:45

    Use this : Swift 3 -

    func createThumbnailOfVideoFromFileURL(videoURL: String) -> UIImage? {
        let asset = AVAsset(url: URL(string: videoURL)!)
        let assetImgGenerate = AVAssetImageGenerator(asset: asset)
        assetImgGenerate.appliesPreferredTrackTransform = true
        let time = CMTimeMakeWithSeconds(Float64(1), 100)
        do {
            let img = try assetImgGenerate.copyCGImage(at: time, actualTime: nil)
            let thumbnail = UIImage(cgImage: img)
            return thumbnail
        } catch {
            return UIImage(named: "ico_placeholder")
        }
    }
    

    Important Note :

    You will need to use this in an if else as it is resource extensive. You will have to store the image in an array or model and check that if once thumbnail has been created it refers to the cache/array so that cellForRowAtIndexPath does not cause a lag in scrolling your UITableView

    0 讨论(0)
  • 2020-12-16 00:48

    Please check the link for "Generating Thumbnails from Videos"

    https://littlebitesofcocoa.com/115-generating-thumbnails-from-videos

    It's quite common for an app to need to display one or more thumbnails (small still-image previews) of what's in a video. However, depending on where the video is coming from, we might not have easy access to pre-made thumbnail(s) for it. Let's look at how we can use AVAssetImageGenerator to grab our own. We start with a simple NSURL for the video, this can be local or remote. We'll create an AVAsset with it and that to a new AVAssetImageGenerator object. We'll configure the generator to apply preferred transforms so our thumbnails are in the correct orientation.

    import AVFoundation
    
    if let asset = AVAsset(URL: videoURL) {
       let durationSeconds = CMTimeGetSeconds(asset.duration)
       let generator = AVAssetImageGenerator(asset: asset)
    
       generator.appliesPreferredTrackTransform = true
    
       let time = CMTimeMakeWithSeconds(durationSeconds/3.0, 600)
       var thumbnailImage: CGImageRef 
       generator.generateCGImagesAsynchronouslyForTimes([NSValue(CMTime: time)]) { 
           (requestedTime: CMTime, thumbnail: CGImage?, actualTime: CMTime, result: AVAssetImageGeneratorResult, error: NSError?) in
          self.videoThumbnailImageView.image = UIImage(CGImage: thumbnail)
        }
    }
    
    0 讨论(0)
  • 2020-12-16 00:50
    //(Local URL)
    NSURL *videoURL = [NSURL fileURLWithPath:filepath];// filepath is your video file path 
    
    
    
    AVURLAsset *asset = [[AVURLAsset alloc] initWithURL:videoURL options:nil];
    AVAssetImageGenerator *generateImg = [[AVAssetImageGenerator alloc] initWithAsset:asset];
    NSError *error = NULL;
    CMTime time = CMTimeMake(1, 1);
    CGImageRef refImg = [generateImg copyCGImageAtTime:time actualTime:NULL error:&error];
    NSLog(@"error==%@, Refimage==%@", error, refImg);
    
    UIImage *frameImage= [[UIImage alloc] initWithCGImage:refImg];
    return frameImage;
    
    0 讨论(0)
  • 2020-12-16 00:52

    Using Swift 5, as an extension function on AVAsset:

    import AVKit
    
    extension AVAsset {
    
        func generateThumbnail(completion: @escaping (UIImage?) -> Void) {
            DispatchQueue.global().async {
                let imageGenerator = AVAssetImageGenerator(asset: self)
                let time = CMTime(seconds: 0.0, preferredTimescale: 600)
                let times = [NSValue(time: time)]
                imageGenerator.generateCGImagesAsynchronously(forTimes: times, completionHandler: { _, image, _, _, _ in
                    if let image = image {
                        completion(UIImage(cgImage: image))
                    } else {
                        completion(nil)
                    }
                })
            }
        }
    }
    

    Usage:

                AVAsset(url: url).generateThumbnail { [weak self] (image) in
                    DispatchQueue.main.async {
                        guard let image = image else { return }
                        self?.imageView.image = image
                    }
                }
    
    0 讨论(0)
  • 2020-12-16 00:52

    Just use this code.. Pass your video URL and get an image.

    +(UIImage *)getPlaceholderImageFromVideo:(NSString *)videoURL {
        NSURL *url = [NSURL URLWithString:videoURL];
        AVAsset *asset = [AVAsset assetWithURL:url];
        AVAssetImageGenerator *imageGenerator = [[AVAssetImageGenerator alloc] initWithAsset:asset];
        CMTime time = [asset duration];
        time.value = 0;
        CGImageRef imageRef = [imageGenerator copyCGImageAtTime:time actualTime:NULL error:NULL];
        UIImage *thumbnail = [UIImage imageWithCGImage:imageRef];
        CGImageRelease(imageRef);
        return thumbnail;
    }
    

    Hope, this is what you're looking for. Any concern get back to me. :)

    0 讨论(0)
提交回复
热议问题