web-dev-qa-db-ja.com

IPhone SDKのビデオURLからサムネイルを作成する

動画のURLからサムネイルを取得しようとしています。ビデオは、m3u8形式のストリーム(HLS)です。 MPMoviePlayerControllerからrequestThumbnailImagesAtTimesをすでに試しましたが、うまくいきませんでした。誰かがその問題の解決策を持っていますか?もしそうなら、あなたはそれをどのように行いましたか?

28
TheRock

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を使用することをお勧めします。これは、スレッドセーフであり、一度に複数のインスタンスを作成できるためです。

47
Aaron Brager

動画のURLからサムネイルを取得します。

    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タイプのデータです!

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

プロジェクトにAVFoundationフレームワークを追加し、<AVFoundation/AVFoundation.h>をインポートすることを忘れないでください。ドキュメントディレクトリに保存されたビデオのパスをパラメーターとして渡し、画像をUIImageとして受け取る必要があります。

9
Ankit Goyal

以下のコードを使用して、ビデオのURLからサムネイルを取得できます

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

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

たぶん、これは同じ問題に直面している他の人にとって有用です。画像、PDF、ビデオのサムネイルを作成する簡単なソリューションが必要でした。その問題を解決するために、次のライブラリを作成しました(Swift内)。

https://github.com/prine/ROThumbnailGenerator

使い方は非常に簡単です:var thumbnailImage = ROThumbnail.getThumbnail(url)

内部には3つの異なる実装があり、ファイル拡張子に応じてサムネイルを作成します。別のファイル拡張子のサムネイルクリエーターが必要な場合は、独自の実装を簡単に追加できます。

2
Prine

Swift 5の場合、次のように取得できます。

最初 import AVKit or AVFoundationからViewController

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メソッドを呼び出し、URLStingとして渡します

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

    guard let `self` = self else { return }

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

ありがとう

1
NøBi Mac

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