17

AVPlayerで動画を再生しています。それは大丈夫です。

今、私はビデオの再生から取得したいと思いますUIImage(私が今のところボタンを押したとき)。

AVPlayer私に添付されているのは、CALayer私のビデオを表示するために使用されますUIView。私の考えは、ビデオの再生中にUIImageから取得することです。CALayer

私は別の質問からのコードでこれを行います:

CALayerのUIImage-iPhoneSDK

しかし、私のUIImageは空です。解像度は良いですが、完全に白です!!!

ビデオは私の内容を書いていないようCALayerです。

誰かが私を助けることができますか?ありがとう

4

3 に答える 3

8

Meet のソリューションはうまく機能しませんでしたが、正しい方向に考えることができました。

以下は、プロジェクトで最終的に使用したコードです。このメソッドは、スクリーンショットを取得する元の のインスタンスと、返される画像の最大サイズとなる をscreenshotFromPlayer:maximumSize:受け入れます。AVPlayerCGSize

- (UIImage *)screenshotFromPlayer:(AVPlayer *)player maximumSize:(CGSize)maxSize {

    CMTime actualTime;
    NSError *error;

    AVAssetImageGenerator *generator = [[AVAssetImageGenerator alloc] initWithAsset:player.currentItem.asset];

    // Setting a maximum size is not necessary for this code to 
    // successfully get a screenshot, but it was useful for my project.
    generator.maximumSize = maxSize;

    CGImageRef cgIm = [generator copyCGImageAtTime:player.currentTime 
                                        actualTime:&actualTime 
                                             error:&error];
    UIImage *image = [UIImage imageWithCGImage:cgIm];
    CFRelease(cgIm);

    if (nil != error) {
        NSLog(@"Error making screenshot: %@", [error localizedDescription]);
        NSLog(@"Actual screenshot time: %f Requested screenshot time: %f", CMTimeGetSeconds(actualTime),
          CMTimeGetSeconds(self.recordPlayer.currentTime));
        return nil;
    }

    return image;
}

( のインスタンスで) のgenerateCGImagesAsynchronouslyForTimes:completionHandler:代わりにメソッドを使用して、画像生成を非同期的に実行できることにも注意してください。copyCGImageAtTime:actualTime:error:AVAssetImageGenerator

このコード サンプルは の でスクリーンショットを生成しますAVPlayercurrentTime、代わりにいつでも使用できます。

于 2012-09-13T21:40:22.967 に答える
8

avplayer から画像を取得するコード。

 - (UIImage *)currentItemScreenShot
{
    AVPlayer *abovePlayer = [abovePlayerView player];
    CMTime time = [[abovePlayer currentItem] currentTime];
    AVAsset *asset = [[[abovePlayerView player] currentItem] asset];
    AVAssetImageGenerator *imageGenerator = [[AVAssetImageGenerator alloc] initWithAsset:asset];
    if ([imageGenerator respondsToSelector:@selector(setRequestedTimeToleranceBefore:)] && [imageGenerator respondsToSelector:@selector(setRequestedTimeToleranceAfter:)]) {
        [imageGenerator setRequestedTimeToleranceBefore:kCMTimeZero];
        [imageGenerator setRequestedTimeToleranceAfter:kCMTimeZero];
    }
    CGImageRef imgRef = [imageGenerator copyCGImageAtTime:time
                                          actualTime:NULL
                                               error:NULL];
    if (imgRef == nil) {
        if ([imageGenerator respondsToSelector:@selector(setRequestedTimeToleranceBefore:)] && [imageGenerator respondsToSelector:@selector(setRequestedTimeToleranceAfter:)]) {
            [imageGenerator setRequestedTimeToleranceBefore:kCMTimePositiveInfinity];
            [imageGenerator setRequestedTimeToleranceAfter:kCMTimePositiveInfinity];
        }
        imgRef = [imageGenerator copyCGImageAtTime:time actualTime:NULL error:NULL];
    }
    UIImage *image = [[UIImage alloc] initWithCGImage:imgRef];
    CGImageRelease(imgRef);
    [imageGenerator release];

    return [image autorelease];
}

設定[imageGenerator setRequestedTimeToleranceBefore:kCMTimeZero]し、[imageGenerator setRequestedTimeToleranceAfter:kCMTimeZero]正確な時間が必要な場合。

于 2012-11-02T11:42:09.030 に答える
1

AVAssetImageGenerator を使用して、指定されたインスタンスでビデオ ファイルから画像を取得してみてください。

    AVURLAsset *asset=[[AVURLAsset alloc] initWithURL:[NSURL fileURLWithPath:[info objectForKey:@"UIImagePickerControllerReferenceURL"]] options:nil];
    AVAssetImageGenerator *generator = [[AVAssetImageGenerator alloc] initWithAsset:asset];
    generator.appliesPreferredTrackTransform=TRUE;
    [アセットリリース];
    CMTime thumbTime = CMTimeMakeWithSeconds(0,30);
    AVAssetImageGeneratorCompletionHandler ハンドラ = ^(CMTime requestedTime, CGImageRef im, CMTime actualTime, AVAssetImageGeneratorResult 結果, NSError *error){
    if (result != AVAssetImageGeneratorSucceeded) {

    }
    UIImage *thumbImg = [[UIImage imageWithCGImage:im] 保持];
    [ジェネレータ解放];
于 2012-06-22T10:50:39.707 に答える