it-swarm.com.de

Erstellen Sie ein Miniaturbild aus einer Video-URL in IPhone SDK

Ich versuche, ein Miniaturbild von einer Video-URL zu erhalten. Das Video ist ein Stream (HLS) mit dem Format m3u8. Ich habe requestThumbnailImagesAtTimes vom MPMoviePlayerController bereits ausprobiert, aber das hat nicht funktioniert. Hat jemand eine Lösung für dieses Problem? Wenn ja, wie hast du das gemacht?

27
TheRock

Wenn Sie MPMoviePlayerController nicht verwenden möchten, können Sie Folgendes tun:

    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

Hier ist ein Beispiel in 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")!
    }
}

Ich bevorzuge die Verwendung von AVAssetImageGenerator gegenüber MPMoviePlayerController, da es Thread-sicher ist und Sie mehrere Instanzen gleichzeitig haben können.

46
Aaron Brager

Ein Miniaturbild von einer Video-URL erwerben.

    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;

Ersetzen Sie Ihren Video-URL-String durch strVideoURL. Sie erhalten ein Miniaturbild als Ausgabe von video. . Das Miniaturbild enthält UIImage-Datendaten!

25
Faizan Refai
-(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];
}

Fügen Sie das AVFoundation-Framework in Ihr Projekt ein und vergessen Sie nicht, <AVFoundation/AVFoundation.h> zu importieren. Sie müssen den Pfad Ihres im Dokumentverzeichnis gespeicherten Videos als Parameter übergeben und das Bild als UIImage erhalten.

8
Ankit Goyal

sie können das Miniaturbild von Ihrer Video-URL mit dem folgenden Code erhalten

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

Swift 3 Version:

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")
    }
}
2

Für 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
    }
}
2
Disha

Vielleicht ist dies nützlich für jemanden, der das gleiche Problem hat. Ich brauchte eine einfache Lösung zum Erstellen einer Miniaturansicht für Bilder, PDFs und Videos. Um dieses Problem zu lösen, habe ich die folgende Bibliothek (in Swift) erstellt.

https://github.com/prine/ROThumbnailGenerator

Die Verwendung ist sehr unkompliziert: Var thumbnailImage = ROThumbnail.getThumbnail (url)

Es hat intern drei verschiedene Implementierungen und erstellt abhängig von der Dateierweiterung die Miniaturansicht. Sie können problemlos Ihre eigene Implementierung hinzufügen, wenn Sie einen Thumbnail-Ersteller für eine andere Dateierweiterung benötigen.

2
Prine

Swift-2-Code mit 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'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
    }
}
0
Avt