IOS7アップデートまで私は使っていました...
UIImage *image = [moviePlayer thumbnailImageAtTime:1.0 timeOption:MPMovieTimeOptionNearestKeyFrame];
...大成功を収めたので、私のアプリは、ユーザーが撮ったばかりのビデオの静止画を表示できました。
IOS7の時点で非推奨になり、代替方法が必要なため、この方法を理解しています。の方法があると思います
- (void)requestThumbnailImagesAtTimes:(NSArray *)playbackTimes timeOption:(MPMovieTimeOption)option
videoReviewボタンの画像内に配置できるように画像を返すにはどうすればよいですか?
よろしくお願いします、ジム。
****通知センターの方法を試した後、編集された質問***
私は次のコードを使用しました-
[moviePlayer requestThumbnailImagesAtTimes:times timeOption:MPMovieTimeOptionNearestKeyFrame];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(MPMoviePlayerThumbnailImageRequestDidFinishNotification::) name:MPMoviePlayerThumbnailImageRequestDidFinishNotification object:moviePlayer];
2つのNSNumberオブジェクト1と2のNSArray時間を作成しました。
次に、次の方法で通知をキャプチャしようとしました
-(void)MPMoviePlayerThumbnailImageRequestDidFinishNotification: (NSDictionary*)info{
UIImage *image = [info objectForKey:MPMoviePlayerThumbnailImageKey];
次に、このサムネイル画像をプレビューとしてのボタン画像として使用しましたが、機能しませんでした。
私のコーディングから私が間違っているところを見ることができれば、あなたの助けをもう一度いただければ幸いです。乾杯
AVAssetImageGeneratorを使用して優れた方法を見つけることができました。以下のコードを参照してください...
AVURLAsset *asset1 = [[AVURLAsset alloc] initWithURL:partOneUrl options:nil];
AVAssetImageGenerator *generate1 = [[AVAssetImageGenerator alloc] initWithAsset:asset1];
generate1.appliesPreferredTrackTransform = YES;
NSError *err = NULL;
CMTime time = CMTimeMake(1, 2);
CGImageRef oneRef = [generate1 copyCGImageAtTime:time actualTime:NULL error:&err];
UIImage *one = [[UIImage alloc] initWithCGImage:oneRef];
[_firstImage setImage:one];
_firstImage.contentMode = UIViewContentModeScaleAspectFit;
ヘッダーファイル内にインポートしてください
#import <AVFoundation/AVFoundation.h>
これは完璧に機能し、viewDidLoadから呼び出すことができました。これは、viewDidAppearから非推奨のthumbNailImageAtTime:を呼び出すよりも高速でした。
これが同じ問題を抱えている他の人に役立つことを願っています。
* ** Swift 5.1 ****の更新
便利な機能...
func createThumbnailOfVideoUrl(url: URL) -> UIImage? {
let asset = AVAsset(url: url)
let assetImgGenerate = AVAssetImageGenerator(asset: asset)
assetImgGenerate.appliesPreferredTrackTransform = true
let time = CMTimeMakeWithSeconds(1.0, preferredTimescale: 600)
do {
let img = try assetImgGenerate.copyCGImage(at: time, actualTime: nil)
let thumbnail = UIImage(cgImage: img)
return thumbnail
} catch {
print(error.localizedDescription)
return nil
}
}
RequestThumbnailImagesAtTimes:timeOption:メソッドは、画像リクエストが完了すると MPMoviePlayerThumbnailImageRequestDidFinishNotification
notification を投稿します。サムネイル画像が必要なコードは NSNotificationCenter
を使用してこの通知をサブスクライブし 、通知を受信したときに画像を使用する必要があります。
それを行う方法は、少なくともiOS7では、あなたの時代にフロートを使用することです
NSNumber *timeStamp = @1.f;
[moviePlayer requestThumbnailImagesAtTimes:timeStamp timeOption:MPMovieTimeOptionNearestKeyFrame];
お役に立てれば
Jeelyは優れた回避策を提供しますが、MPMoviePlayerがすでにこのタスクの関数を提供している場合は、必要のない追加のライブラリが必要です。元の投稿者のコードに構文エラーがあることに気づきました。サムネイル通知ハンドラーは、ディクショナリオブジェクトではなく、NSNotificationタイプのオブジェクトを想定しています。修正された例は次のとおりです。
-(void)MPMoviePlayerThumbnailImageRequestDidFinishNotification: (NSNotification*)note
{
NSDictionary * userInfo = [note userInfo];
UIImage *image = (UIImage *)[userInfo objectForKey:MPMoviePlayerThumbnailImageKey];
if(image!=NULL)
[thumbView setImage:image];
}
問題は、requestThumbnailImagesAtTimes
でfloat値を指定する必要があることです。
たとえば、これ動作します
[self.moviePlayer requestThumbnailImagesAtTimes:@[@14.f] timeOption:MPMovieTimeOptionNearestKeyFrame];
しかしこれ動作しません:
[self.moviePlayer requestThumbnailImagesAtTimes:@[@14] timeOption:MPMovieTimeOptionNearestKeyFrame];
私はこの問題の解決策を自分で探したところ、あなたの質問から良い助けを得ました。上記のコードを取得して、1つの小さな変更で機能し、コロンを削除しました...
変化する
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(MPMoviePlayerThumbnailImageRequestDidFinishNotification::) name:MPMoviePlayerThumbnailImageRequestDidFinishNotification object:moviePlayer];
に
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(MPMoviePlayerThumbnailImageRequestDidFinishNotification:) name:MPMoviePlayerThumbnailImageRequestDidFinishNotification object:moviePlayer];
これがうまく機能するようになりました。また、すでに通知セレクターを使用している場合は、NotificationCenterに依存するメソッドを呼び出すことができないことがわかりました。最初に試したもの-requestThumbnailImagesAtTimes
の通知セレクター内でMPMoviePlayerPlaybackDidFinishNotification
を呼び出してみました-機能しません。通知が出ないからだと思います。
Swift 2.1のコードは次のようになります:
do{
let asset1 = AVURLAsset(URL: url)
let generate1: AVAssetImageGenerator = AVAssetImageGenerator(asset: asset1)
generate1.appliesPreferredTrackTransform = true
let time: CMTime = CMTimeMake(3, 1) //TO CATCH THE THIRD SECOND OF THE VIDEO
let oneRef: CGImageRef = try generate1.copyCGImageAtTime(time, actualTime: nil)
let resultImage = UIImage(CGImage: oneRef)
}
catch let error as NSError{
print(error)
}