web-dev-qa-db-ja.com

thumbmailImageAtTime:非推奨になりました-代替手段は何ですか?

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

次に、このサムネイル画像をプレビューとしてのボタン画像として使用しましたが、機能しませんでした。

私のコーディングから私が間違っているところを見ることができれば、あなたの助けをもう一度いただければ幸いです。乾杯

22
Jim Tierney

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
        }
    }
42
Jim Tierney

RequestThumbnailImagesAtTimes:timeOption:メソッドは、画像リクエストが完了すると MPMoviePlayerThumbnailImageRequestDidFinishNotificationnotification を投稿します。サムネイル画像が必要なコードは NSNotificationCenterを使用してこの通知をサブスクライブし 、通知を受信したときに画像を使用する必要があります。

5
Greg

それを行う方法は、少なくともiOS7では、あなたの時代にフロートを使用することです

NSNumber *timeStamp = @1.f;
[moviePlayer requestThumbnailImagesAtTimes:timeStamp timeOption:MPMovieTimeOptionNearestKeyFrame];

お役に立てれば

2
nimeshdesai

Jeelyは優れた回避策を提供しますが、MPMoviePlayerがすでにこのタスクの関数を提供している場合は、必要のない追加のライブラリが必要です。元の投稿者のコードに構文エラーがあることに気づきました。サムネイル通知ハンドラーは、ディクショナリオブジェクトではなく、NSNotificationタイプのオブジェクトを想定しています。修正された例は次のとおりです。

-(void)MPMoviePlayerThumbnailImageRequestDidFinishNotification: (NSNotification*)note
{
    NSDictionary * userInfo = [note userInfo];
    UIImage *image = (UIImage *)[userInfo objectForKey:MPMoviePlayerThumbnailImageKey];
    if(image!=NULL)
        [thumbView setImage:image];
}
2
Jonesy

問題は、requestThumbnailImagesAtTimesでfloat値を指定する必要があることです。

たとえば、これ動作します

[self.moviePlayer requestThumbnailImagesAtTimes:@[@14.f] timeOption:MPMovieTimeOptionNearestKeyFrame];

しかしこれ動作しません

[self.moviePlayer requestThumbnailImagesAtTimes:@[@14] timeOption:MPMovieTimeOptionNearestKeyFrame];
2
sash

私はこの問題の解決策を自分で探したところ、あなたの質問から良い助けを得ました。上記のコードを取得して、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を呼び出してみました-機能しません。通知が出ないからだと思います。

0
Frippuz

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