从IPhone SDK中的视频网址创建缩略图

时间:2011-09-21 14:19:58

标签: ios objective-c video thumbnails

我正在尝试从视频网址获取缩略图。视频是具有m3u8格式的流(HLS)。 我已经尝试过来自MPMoviePlayerController的requestThumbnailImagesAtTimes,但是没有用。有没有人有解决这个问题的方法?如果是这样你怎么做的?

9 个答案:

答案 0 :(得分:46)

如果您不想使用MPMoviePlayerController,可以执行以下操作:

    AVAsset *asset = [AVAsset assetWithURL:sourceURL];
    AVAssetImageGenerator *imageGenerator = [[AVAssetImageGenerator alloc]initWithAsset:asset];
    CMTime time = CMTimeMake(1, 1);
    CGImageRef imageRef = [imageGenerator copyCGImageAtTime:time actualTime:NULL error:NULL];
    UIImage *thumbnail = [UIImage imageWithCGImage:imageRef];
    CGImageRelease(imageRef);  // CGImageRef won't be released by ARC

这是斯威夫特的一个例子:

func thumbnail(sourceURL sourceURL:NSURL) -> UIImage {
    let asset = AVAsset(URL: sourceURL)
    let imageGenerator = AVAssetImageGenerator(asset: asset)
    let time = CMTime(seconds: 1, preferredTimescale: 1)

    do {
        let imageRef = try imageGenerator.copyCGImageAtTime(time, actualTime: nil)
        return UIImage(CGImage: imageRef)
    } catch {
        print(error)
        return UIImage(named: "some generic thumbnail")!
    }
}

我更喜欢使用AVAssetImageGenerator而不是MPMoviePlayerController,因为它是线程安全的,并且您可以一次实例化多个。

答案 1 :(得分:25)

  

从视频网址获取缩略图。

    NSString *strVideoURL = @"http://www.xyzvideourl.com/samplevideourl";
    NSURL *videoURL = [NSURL URLWithString:strVideoURL] ;
    MPMoviePlayerController *player = [[[MPMoviePlayerController alloc] initWithContentURL:videoURL]autorelease];
    UIImage  *thumbnail = [player thumbnailImageAtTime:1.0 timeOption:MPMovieTimeOptionNearestKeyFrame];
    player = nil;

将您的视频网址字符串替换为strVideoURL。 您将获得video的输出缩略图。 缩略图是UIImage类型数据!

答案 2 :(得分:9)

-(UIImage *)loadThumbNail:(NSURL *)urlVideo
{    
    AVURLAsset *asset = [[AVURLAsset alloc] initWithURL:urlVideo options:nil];
    AVAssetImageGenerator *generate = [[AVAssetImageGenerator alloc] initWithAsset:asset];
    generate.appliesPreferredTrackTransform=TRUE;
    NSError *err = NULL;
    CMTime time = CMTimeMake(1, 60);
    CGImageRef imgRef = [generate copyCGImageAtTime:time actualTime:NULL error:&err];
    NSLog(@"err==%@, imageRef==%@", err, imgRef);
    return [[UIImage alloc] initWithCGImage:imgRef];
}

在您的项目中添加AVFoundation框架,不要忘记导入<AVFoundation/AVFoundation.h>,您必须将保存在文档目录中的视频路径作为参数传递,并将图像作为{{1 }}

答案 3 :(得分:4)

您可以使用以下代码

从您的视频网址获取缩略图
MPMoviePlayerController *player = [[[MPMoviePlayerController alloc] initWithContentURL:videoURL]autorelease];
UIImage  *thumbnail = [player thumbnailImageAtTime:0.0 timeOption:MPMovieTimeOptionNearestKeyFrame];

答案 4 :(得分:2)

也许这对面临同样问题的其他人有用。我需要一个简单的解决方案来创建图像,PDF和视频的缩略图。为了解决这个问题,我创建了以下库(在Swift中)。

https://github.com/prine/ROThumbnailGenerator

使用非常简单: var thumbnailImage = ROThumbnail.getThumbnail(url)

它内部有三种不同的实现,根据文件扩展名,它确实创建了缩略图。如果您需要另一个文件扩展名的缩略图创建者,则可以轻松添加自己的实现。

答案 5 :(得分:2)

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 {
        // Set a default image if Image is not acquired
        return UIImage(named: "ico_placeholder")
    }
}

答案 6 :(得分:2)

对于Swift 3.0:

  func generateThumbnailForVideoAtURL(filePathLocal: NSString) -> UIImage? {
    let vidURL = NSURL(fileURLWithPath:filePathLocal as String)
    let asset = AVURLAsset(url: vidURL as URL)
    let generator = AVAssetImageGenerator(asset: asset)
    generator.appliesPreferredTrackTransform = true

    let timestamp = CMTime(seconds: 1, preferredTimescale: 60)

    do {
        let imageRef = try generator.copyCGImage(at: timestamp, actualTime: nil)
        let frameImg    : UIImage = UIImage(cgImage: imageRef)
        return frameImg
    } catch let error as NSError {
        print("Image generation failed with error ::\(error)")
        return nil
    }
}

答案 7 :(得分:2)

对于 Swift 5 ,您可以通过以下方式获取它:

import AVKit or AVFoundationViewController

import AVKit

代码:

// Get Thumbnail Image from URL
private func getThumbnailFromUrl(_ url: String?, _ completion: @escaping ((_ image: UIImage?)->Void)) {

    guard let url = URL(string: url ?? "") else { return }

    DispatchQueue.main.async {
        let asset = AVAsset(url: url)
        let assetImgGenerate = AVAssetImageGenerator(asset: asset)
        assetImgGenerate.appliesPreferredTrackTransform = true

        let time = CMTimeMake(value: 2, timescale: 1)
        do {
            let img = try assetImgGenerate.copyCGImage(at: time, actualTime: nil)
            let thumbnail = UIImage(cgImage: img)
            completion(thumbnail)
        } catch {
            print("Error :: ", error.localizedDescription)
            completion(nil)
        }
    }
}

用法

@IBOutlet weak imgThumbnail: ImageView! 

,然后调用getThumbnailFromUrl方法并将URL作为Sting传递

self.getThumbnailFromUrl(videoURL) { [weak self] (img) in

    guard let `self` = self else { return }

    if let img = img {
        self.imgThumbnail.image = img
    }
}

谢谢

答案 8 :(得分:0)

使用AVAssetImageGenerator的Swift 2代码:

func thumbnailImageForVideo(url:NSURL) -> UIImage?
{
    let asset = AVAsset(URL: url)
    let imageGenerator = AVAssetImageGenerator(asset: asset)
    imageGenerator.appliesPreferredTrackTransform = true

    var time = asset.duration
    //If possible - take not the first frame (it could be completely black or white on camara's videos)
    time.value = min(time.value, 2)

    do {
        let imageRef = try imageGenerator.copyCGImageAtTime(time, actualTime: nil)
        return UIImage(CGImage: imageRef)
    }
    catch let error as NSError
    {
        print("Image generation failed with error \(error)")
        return nil
    }
}
相关问题