且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

如何以编程方式捕获正在播放的视频的屏幕截图?

更新时间:2023-01-17 22:59:42

希望这段代码能有所帮助

- (void)setupVideoPlayerView
{
videoPlayerVC = [[AVPlayerViewController alloc] init];
videoPlayerVC.view.frame = self.videoPlayerView.bounds;
videoPlayerVC.videoGravity = AVLayerVideoGravityResizeAspectFill
[videoPlayerView addSubview:_videoPlayerVC.view];
[videoPlayerVC setShowsPlaybackControls:NO];
videoPlayerVC.player = [AVPlayer playerWithURL:[NSURL URLWithString:kVideoURL];
[videoPlayerVC.player play];
}

- (UIImage *)snapImageFromRuningVideo
{
AVAsset *assest = [self.videoPlayerVC.player.currentItem asset];
AVAssetImageGenerator *imageGenerator = [AVAssetImageGenerator assetImageGeneratorWithAsset:assest];
CGImageRef imageRef = [imageGenerator copyCGImageAtTime:self.videoPlayerVC.player.currentItem.currentTime actualTime:nil error:nil];
UIImage *screengrab = [UIImage imageWithCGImage:imageRef];
return screengrab;
}

如果你想要控制器栏,这里只创建 AVPlayerViewController 或者只是实例化 AVPlayer 并绑定视频的 URL 并播放.

here just create AVPlayerViewController if you want controller bar or just instantiate AVPlayer and bind the URL of the Video and play.

每当您想在点击快照按钮时捕获当时正在运行的视频的快照时,您都可以调用方法snapImageFromRuningVideo",该方法将返回 UIImage 对象引用.

whenever you want to capture a snapshot of the running video at that time on button click of Snapshot you can call method "snapImageFromRuningVideo" which will return UIImage object reference.

AVPlayer 在内部创建 AVPlayerItem 和 AVAsset 对象.现在只需使用 AVAsset 对象创建 AVAssetImageGenerator 对象,然后通过调用从您想要拍摄快照的时间复制图像"CGImageRef imageRef = [imageGenerator copyCGImageAtTime:self.videoPlayerVC.player.currentItem.currentTime actualTime:nil error:nil];"

AVPlayer internally create AVPlayerItem and AVAsset object. now create AVAssetImageGenerator object just by using AVAsset object then copy the image at a time from when you want to take the snapshot by calling "CGImageRef imageRef = [imageGenerator copyCGImageAtTime:self.videoPlayerVC.player.currentItem.currentTime actualTime:nil error:nil];"

这里我们必须在拍摄快照的瞬间传递玩家当前时间

here we have to pass player current time at the instant of taking the snapshot