iOS - 如何在没有游戏的情况下从视频获取缩略图?

Tie*_*nLe 10 image ios video-thumbnails

我正在尝试从视频中获取缩略图并在我的tableview中显示它.这是我的代码:

- (UIImage *)imageFromVideoURL:(NSURL *)contentURL {
    AVAsset *asset = [AVAsset assetWithURL:contentURL];

    //  Get thumbnail at the very start of the video
    CMTime thumbnailTime = [asset duration];
    thumbnailTime.value = 25;

    //  Get image from the video at the given time
    AVAssetImageGenerator *imageGenerator = [[AVAssetImageGenerator alloc] initWithAsset:asset];

    CGImageRef imageRef = [imageGenerator copyCGImageAtTime:thumbnailTime actualTime:NULL error:NULL];
    UIImage *thumbnail = [UIImage imageWithCGImage:imageRef];
    CGImageRelease(imageRef);

    return thumbnail;
}
Run Code Online (Sandbox Code Playgroud)

但是图像总是回归黑色.怎么了?

Sam*_*uël 12

使用 Swift 5,作为 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)
                }
            })
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

用法:

            AVAsset(url: url).generateThumbnail { [weak self] (image) in
                DispatchQueue.main.async {
                    guard let image = image else { return }
                    self?.imageView.image = image
                }
            }
Run Code Online (Sandbox Code Playgroud)

  • 您的代码不尊重资产转换,因此请添加“imageGenerator.appliesPreferredTrackTransform = true”以获取未旋转的图像。 (2认同)

Ank*_*pta 7

使用此: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")
    }
}
Run Code Online (Sandbox Code Playgroud)

重要的提示 :

你需要在if else中使用它,因为它是资源广泛的.您必须将图像存储在数组或模型中,并检查一旦创建了缩略图,它就会引用缓存/数组,这样cellForRowAtIndexPath就不会导致滚动延迟UITableView


Moh*_*mar 3

//(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;
Run Code Online (Sandbox Code Playgroud)