大きなビュー内でAVPlayer
のスクリーンショットを撮ろうとしています。テストフレームワークのみを構築したいので、プライベートAPIs
または任意のメソッドが適しています。これは、AppStoreにリリースするときにフレームワークが含まれないためです。
使ってみました
UIGetScreenImage()
:シミュレーターではうまく機能しますが、デバイスでは機能しませんsnapshotviewafterscreenupdates
:ビューが表示されますが、そこからUIImage
を作成できません。drawViewInHierarchy
およびrenderInContext
はAVPlayer
では機能しませんAVAssetGenerator
を使用したくないので、他のビューのサブビューとして適切な座標またはビデオプレーヤーを取得するのは困難です。AVAssetImageGeneratorを使用したくないことは承知していますが、これについても広範囲にわたって調査しました。現在、唯一の解決策はAVAssetImageGeneratorを使用することだと思います。プレーヤーの現在の時刻を取得できるはずなので、正しい座標を取得することはあなたが言うほど難しくはありません。私のアプリでは、次のコードが完全に機能します。
-(UIImage *)getAVPlayerScreenshot
{
AVURLAsset *asset = (AVURLAsset *)self.playerItem.asset;
AVAssetImageGenerator *imageGenerator = [[AVAssetImageGenerator alloc] initWithAsset:asset];
imageGenerator.requestedTimeToleranceAfter = kCMTimeZero;
imageGenerator.requestedTimeToleranceBefore = kCMTimeZero;
CGImageRef thumb = [imageGenerator copyCGImageAtTime:self.playerItem.currentTime
actualTime:NULL
error:NULL];
UIImage *videoImage = [UIImage imageWithCGImage:thumb];
CGImageRelease(thumb);
return videoImage;
}