web-dev-qa-db-ja.com

AVPlayerとビデオのスクリーンショット

大きなビュー内でAVPlayerのスクリーンショットを撮ろうとしています。テストフレームワークのみを構築したいので、プライベートAPIsまたは任意のメソッドが適しています。これは、AppStoreにリリースするときにフレームワークが含まれないためです。

使ってみました

  • UIGetScreenImage():シミュレーターではうまく機能しますが、デバイスでは機能しません
  • snapshotviewafterscreenupdates:ビューが表示されますが、そこからUIImageを作成できません。
  • drawViewInHierarchyおよびrenderInContextAVPlayerでは機能しません
  • ビデオから画像を取得するためにAVAssetGeneratorを使用したくないので、他のビューのサブビューとして適切な座標またはビデオプレーヤーを取得するのは困難です。
49
vodkhang

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;
}
8
Bob de Graaf