1

アプリがフォアグラウンドにあるときに iPhone の画面をキャプチャする必要があります。私はこれを使用UIGraphicsGetImageFromCurrentImageContaxt()しましたが、ほとんどの synerio で動作しますが、MPMoviePlayerViewControllerまたは AVPlayer を使用してビデオを再生すると失敗し、プレーヤー コントロールで黒い画像が返されます。

おそらく私の推測ではMPMoviePlayerViewController、OpenGl を使用してフレームをレンダリングしており、メソッドUIGraphicsGetImageFromCurrentImageContaxt()は画像をキャプチャできませんか??

何か不足していますか、アプリがフォアグラウンドにあるときに iPhone 画面をキャプチャするために利用できる代替ソリューションはありますか??

4

3 に答える 3

3

これには簡単な解決策はありません (つまり、私にはわからないかもしれません) が、理解する必要があります。ここでは、考えられる解決策について説明しました。コンテキストでビューを単純にレンダリングしようとすると、プレーヤーの代わりに空白の画面が表示され、他のものはそのままになります。

私が知っている可能な解決策
プライベート API
関数を 使用UIGetScreenImage()して、プレーヤーとそのコントロールを含むデバイスの画面全体をキャプチャできます。これにより、ビュー付きのプレーヤーのイメージを簡単に取得できます。
:一部の仲間は、この機能を使用するとアプリケーションが拒否される可能性があると言っています(私はアプリストアのアプリに使用したことがないので、あまり経験がありません:))。

第二の方法。

メインビューまたはiPhone画面にある他のものと一緒にプレーヤーの画像を取得したい場合、基本的な考え方は、2つの画像(つまり、ムービープレーヤーの1つと、使用している画面全体のもう1つ)をキャプチャしUIGraphicsGetImageFromCurrentImageContext、それらを結合することです。いくつかの適切な計算を使用して1つの画像。このようにして、いくつかの計算を行う必要があるため、精度は計算に依存します。

ここではAVPlayer、MPMoviePlayer の代わりに使用することを好みますが、本当かどうかはわかりませんが、AVPlayer が特定の時間に正確なフレームを提供していると感じているためです (精度が高く、画面に表示されている正確な画像です。)

AVPlayerの重力モードを に設定してくださいAVLayerVideoGravityResizeAspect。このモードは縦横比を保持し、レイヤーの境界内に収まります (つまり、このオプションはデフォルトです)。このように設定できます。

playerLayer.videoGravity = setVideoFillMode:AVLayerVideoGravityResizeAspect;

ここで、playerLayer は のオブジェクトですAVPlayerLayer

今のイメージを取得しますAVPlayerLayer

AVAssetImageGenerator *imageGenerator = [[AVAssetImageGenerator alloc] 
                                                     initWithAsset:asset];
            imageGenerator.appliesPreferredTrackTransform=YES;
            /*AVAssetImageGenerator will scale images such that they fit within the defined bounding box. Images will never be scaled up. So provide this should be the size of AVPlayer. */
            imageGenerator.maximumSize=CGSizeMake(400, 400); 
            CGImageRef imgRef = [imageGenerator copyCGImageAtTime:storedCMTime actualTime:NULL error:NULL];
            [imageGenerator release];

この生成された画像は、探しているものと正確なサイズではない場合があることに注意してください。または、上記のコメントで述べたように、画像が拡大されることはないため、最大サイズを正確に指定したためです。画像が見ているものと正確なサイズでない場合は、画像ユーティリティ関数を使用してプレーヤーのサイズに合わせて画像をスケーリングしますが、AVPLayer のモードを AVLayerVideoGravityResizeAspect.store この画像を一時的に保存するため、アスペクト比を損なうことはありません.

UIGraphicsGetImageFromCurrentImageContextを使用してビューの画像をキャプチャします(つまり、現在行っているように)。ビューに表示されている黒い領域に正確にキャプチャして保存した AVplayer の画像を描画します (つまり、まったく同じものを取得するには、試行錯誤を行う必要があります)。

ここでは、パニックを引き起こす可能性がある、またはすぐにはわからない可能性のあるすべての主要なポイントをカバーしようとしました.

更新: APPLE のスクリーン キャプチャ ソリューション: http://developer.apple.com/library/ios/#qa/qa1703/_index.html#//apple_ref/doc/uid/DTS40010193

MPMoviewPlayerController を使用したい場合は、問題ありません。@Kuldeep によるコード ショーを使用してサムネイルを取得します。そして、画像マスキングを使用して両方のビューの画像とサムネイルを組み合わせると、ここで正確に説明されます:リンク

于 2012-08-27T06:49:37.527 に答える
0

AVPlayer でフレームをキャプチャする解決策を見つけたようです。

    - (UIImage*) captureFrame {

    AVAssetImageGenerator *imageGenerator = [AVAssetImageGenerator assetImageGeneratorWithAsset:[self.player.currentItem asset]];

    if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 5) {
        [imageGenerator setRequestedTimeToleranceAfter:kCMTimeZero];
        [imageGenerator setRequestedTimeToleranceBefore:kCMTimeZero];
    }

    CGImageRef ref = [imageGenerator copyCGImageAtTime:self.player.currentItem.currentTime actualTime:nil error:nil];
    UIImage *img = [UIImage imageWithCGImage:ref];
    CGImageRelease(ref);

    return img;
}
于 2012-10-19T16:01:20.167 に答える
0

以下のスニペットを使用することをお勧めします。より使いやすいかもしれません。ビデオをキャプチャする必要がある時間係数を渡すだけです。

float timeFactor = 60.0;
CGRect rect = CGRectMake(self.view.center.x, self.view.center.y, 100.0, 100.0)
MPMoviePlayerController *player = [[MPMoviePlayerController alloc] initWithContentURL:videoURL];
UIImage *thumbnail = [player thumbnailImageAtTime:timeFactor timeOption:MPMovieTimeOptionNearestKeyFrame];
UIImageView *imagV=[[UIImageView alloc]initWithImage:thumbnail];
[imagV setFrame:rect];
于 2012-09-01T06:21:03.087 に答える