Создание эскизов видеоролика в IPhone SDK

Я пытаюсь получить эскиз видеоролика. Видео представляет собой поток (HLS) с форматом m3u8. Я уже пробовал запросThumbnailImagesAtTimes из MPMoviePlayerController, но это не сработало. У кого-нибудь есть решение этой проблемы? Если да, то как вы это сделали?

Ответ 1

Если вы не хотите использовать 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

Вот пример в Swift:

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, потому что он потокобезопасен, и вы можете иметь более одного экземпляра за раз.

Ответ 2

Получите эскиз видеоролика.

    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;

Замените строку вашего видео URL strVideoURL. Вы получите миниатюру в виде вывода из video. И миниатюрами являются данные типа UIImage!

Ответ 3

-(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 framework в свой проект и не забудьте импортировать <AVFoundation/AVFoundation.h>, и вам необходимо передать путь вашего видео, сохраненного в каталоге документа, в качестве параметра и получить изображение как UIImage.

Ответ 4

вы можете получить миниатюру с вашего видеоролика с использованием ниже кода

MPMoviePlayerController *player = [[[MPMoviePlayerController alloc] initWithContentURL:videoURL]autorelease];
UIImage  *thumbnail = [player thumbnailImageAtTime:0.0 timeOption:MPMovieTimeOptionNearestKeyFrame];

Ответ 5

Возможно, это полезно для кого-то, кто сталкивается с той же проблемой. Мне нужно было простое решение для создания миниатюры для изображений, PDF файлов и видео. Чтобы решить эту проблему, я создал следующую библиотеку (в Swift).

https://github.com/prine/ROThumbnailGenerator

Использование очень просто: var thumbnailImage = ROThumbnail.getThumbnail(url)

Он имеет три разных реализации и в зависимости от расширения файла создает миниатюру. Вы можете легко добавить свою собственную реализацию, если вам нужен создатель миниатюр для другого расширения файла.

Ответ 6

Версия 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")
    }
}

Ответ 7

Для 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
    }
}

Ответ 8

Код Swift 2 с AVAssetImageGenerator:

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