19

iPhone用に開発中のアプリケーションがあります。カメラからビデオをキャプチャし、ビデオ ファイルをファイル システムに保存します。

画像をファイル システムに保存する前に、このビデオ ファイルのサムネイル画像を作成する必要があります。私の動機は、作成されたビデオのサムネイルのリストを表示して、ユーザーが特定のサムネイルを選択して目的のファイルを再生できるようにすることです。

カメラでキャプチャされたビデオ ファイルのサムネイル画像を作成する方法について、アドバイスをお願いします。

また、iOS SDK を使用して既存のビデオ ファイルのサムネイルを作成できるかどうか教えてください。

4

5 に答える 5

33

より良い解決策は、実際には AVFoundation フレームワークを使用してこれを行うことです。UIImagePickerController と組み合わせて使用​​すると、カメラのアイリスが閉じたままになるという問題を引き起こす MPMoviePlayerController を構築する必要がありません (少なくともそれは私が経験したことです)。

私が使用するコード:

+ (UIImage *)thumbnailFromVideoAtURL:(NSURL *)contentURL {
    UIImage *theImage = nil;
    AVURLAsset *asset = [[AVURLAsset alloc] initWithURL:contentURL options:nil];
    AVAssetImageGenerator *generator = [[AVAssetImageGenerator alloc] initWithAsset:asset];
    generator.appliesPreferredTrackTransform = YES;
    NSError *err = NULL;
    CMTime time = CMTimeMake(1, 60);
    CGImageRef imgRef = [generator copyCGImageAtTime:time actualTime:NULL error:&err];

    theImage = [[[UIImage alloc] initWithCGImage:imgRef] autorelease];

    CGImageRelease(imgRef);
    [asset release];
    [generator release];

    return theImage;
}
于 2012-05-20T20:38:26.310 に答える
19

これを試してください(実際にはムービープレーヤーは表示されません):

+ (UIImage *)imageFromMovie:(NSURL *)movieURL atTime:(NSTimeInterval)time {
  // set up the movie player
  MPMoviePlayerController *mp = [[MPMoviePlayerController alloc] 
    initWithContentURL:movieURL];
  mp.shouldAutoplay = NO;
  mp.initialPlaybackTime = time;
  mp.currentPlaybackTime = time;
  // get the thumbnail
  UIImage *thumbnail = [mp thumbnailImageAtTime:time 
                           timeOption:MPMovieTimeOptionNearestKeyFrame];
  // clean up the movie player
  [mp stop];
  [mp release];
  return(thumbnail);
}

同期呼び出しであるはずなので、メインスレッドをブロックする可能性がありますが、映画の冒頭で時間を使うと、すぐに実行されているようです。これを頻繁に行う場合は、UIImageのカテゴリとして追加できます。これは私が行ったことです。

あなたの質問から、ムービーを保存する前にこれを実行したいと思います。ファイルのURLがないと機能しない可能性があります。ただし、カメラキャプチャにUIImagePickerControllerを使用している場合は、この関数に、imagePickerController:didFinishPickingMediaWithInfo:の情報ディクショナリで返されたURLをキーUIImagePickerControllerMediaURLで渡すことができます。

于 2011-06-21T21:14:12.997 に答える
3

非常に簡単にこれを試してみてください...

ステップ 1 : ヘッダーのインポート#import <MediaPlayer/MediaPlayer.h>

ステップ 2 : URL パスを取得する

NSURL *videoURL = [NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:@"Sample" ofType:@"m4v"]];

ステップ 3 : 最後にサムネイルを取得する

- (UIImage *)VideoThumbNail:(NSURL *)videoURL
{
    MPMoviePlayerController *player = [[MPMoviePlayerController alloc] initWithContentURL:videoURL];
    UIImage *thumbnail = [player thumbnailImageAtTime:52.0 timeOption:MPMovieTimeOptionNearestKeyFrame];
    [player stop];
    return thumbnail;
}
于 2014-04-16T12:16:52.140 に答える
0

フレームワークと Swift 3.0を使用するソリューションのAVFoundationコード (コメント付きのコードは必要ありません。コードの下で説明します。必要かどうかを判断する必要があります):

import AVFoundation

func generateThumbnailForVideo(at url: URL) -> UIImage? {
    let kPreferredTimescale: Int32 = 1000
    let asset = AVURLAsset(url: url)
    let generator = AVAssetImageGenerator(asset: asset)
    generator.appliesPreferredTrackTransform = true
    //generator.requestedTimeToleranceBefore = kCMTimeZero
    //generator.requestedTimeToleranceAfter = kCMTimeZero
    //generator.maximumSize = CGSize(width: 100, height: 100)

    var actualTime: CMTime = CMTime(seconds: 0, preferredTimescale: kPreferredTimescale)
    //generates thumbnail at first second of the video
    let cgImage = try? generator.copyCGImage(at: CMTime(seconds: 1, preferredTimescale: kPreferredTimescale), actualTime: &actualTime)
    return cgImage.flatMap() { return UIImage(cgImage: $0, scale: UIScreen.main.scale, orientation: .up) }
}

サムネイルの作成にはコストがかかる可能性があるため、このコードをバックグラウンド スレッドで実行することを検討してください。

AVAssetImageGeneratorまた、クラスのプロパティのいくつかを見てください。

  1. requestedTimeToleranceBefore( Apple のドキュメント):

画像が生成される可能性がある、要求された時間までの最大時間。

デフォルト値は kCMTimePositiveInfinity です。

requestedTimeToleranceBefore と requestedTimeToleranceAfter の値を kCMTimeZero に設定して、フレーム精度の画像生成を要求します。これにより、追加のデコード遅延が発生する可能性があります。

  1. requestedTimeToleranceAfter( Apple のドキュメント):

要求された時間からイメージが生成されるまでの最大時間。

デフォルト値は kCMTimePositiveInfinity です。

requestedTimeToleranceBefore と requestedTimeToleranceAfter の値を kCMTimeZero に設定して、フレーム精度の画像生成を要求します。これにより、追加のデコード遅延が発生する可能性があります。

  1. maximumSize( Apple のドキュメント):

生成された画像の最大サイズを指定します。

デフォルト値は CGSizeZero で、アセットのスケーリングされていない寸法を指定します。

AVAssetImageGenerator は、定義された境界ボックス内に収まるように画像をスケーリングします。画像が拡大されることはありません。スケーリングされた画像の縦横比は、アパーチャモード プロパティによって定義されます。

于 2016-11-14T11:12:08.643 に答える
0

これを試して :

generate.requestedTimeToleranceBefore = kCMTimeZero;
generate.requestedTimeToleranceAfter = kCMTimeZero;

正しいフレームを取得するには、追加する必要があります。

于 2015-04-20T05:49:27.127 に答える