AVPlayer和视频的屏幕截图

vod*_*ang 48 testing objective-c avfoundation ios avplayer

我试图AVPlayer在一个更大的视图内截取屏幕截图.我想只构建一个测试框架,所以私有APIs或任何方法都是好的,因为在发布到AppStore时不会包含框架.

我试过用

  • UIGetScreenImage() :在模拟器上运行良好但在设备上运行不正常
  • snapshotviewafterscreenupdates:它显示视图,但我不能创建一个UIImage.
  • drawViewInHierarchy并且renderInContext不会合作AVPlayer
  • 我不想AVAssetGenerator用于从视频中获取图像,很难获得良好的坐标或视频播放器作为其他视图的子视图

Bob*_*aaf 8

我知道你不想使用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;
}
Run Code Online (Sandbox Code Playgroud)

  • @JAL OP 可以指定他们想要什么,有时答案是您不能。你必须以你不想要的方式去做。或者这些是这样做的好处。不管OP不享受,其他人都可以从答案中受益 (3认同)

小智 -5

CGRect grabRect = CGRectMake(0,0,320,568);// size you want to take screenshot of. 

if ([[UIScreen mainScreen] respondsToSelector:@selector(scale)]) {
   UIGraphicsBeginImageContextWithOptions(grabRect.size, NO, [UIScreen mainScreen].scale);
 } else {
      UIGraphicsBeginImageContext(grabRect.size);
}
CGContextRef ctx = UIGraphicsGetCurrentContext();
CGContextTranslateCTM(ctx, -grabRect.origin.x, -grabRect.origin.y);
[self.view.layer renderInContext:ctx];
UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
Run Code Online (Sandbox Code Playgroud)

  • 不,那不行。AVPlayer 无法与 renderInContext 一起使用 (4认同)