我用 AVPlayer 播放视频。工作正常。
现在我想从播放的视频中获取UIImage
(当我暂时按下按钮时)。
附加到我的AVPlayer
有一个CALayer
,用于在我的UIView
上显示视频。
我的想法是在视频播放期间从 CALayer
获取 UIImage
。
我用另一个问题的代码来做到这一点:
UIImage from CALayer - iPhone SDK
但是我的 UIImage
是空的。分辨率很好,但它是全白的!!!
视频似乎没有写入我的 CALayer
的内容。
有人可以帮助我吗? 谢谢
最佳答案
我无法让 Meet 的解决方案为我所用,但它让我朝着正确的方向思考。
下面是我最终在项目中使用的代码。 screenshotFromPlayer:maximumSize:
方法接受一个用于截取屏幕截图的 AVPlayer
实例,以及一个作为返回图像最大值的 CGSize
尺寸。
- (UIImage *)screenshotFromPlayer:(AVPlayer *)player maximumSize:(CGSize)maxSize {
CMTime actualTime;
NSError *error;
AVAssetImageGenerator *generator = [[AVAssetImageGenerator alloc] initWithAsset:player.currentItem.asset];
// Setting a maximum size is not necessary for this code to
// successfully get a screenshot, but it was useful for my project.
generator.maximumSize = maxSize;
CGImageRef cgIm = [generator copyCGImageAtTime:player.currentTime
actualTime:&actualTime
error:&error];
UIImage *image = [UIImage imageWithCGImage:cgIm];
CFRelease(cgIm);
if (nil != error) {
NSLog(@"Error making screenshot: %@", [error localizedDescription]);
NSLog(@"Actual screenshot time: %f Requested screenshot time: %f", CMTimeGetSeconds(actualTime),
CMTimeGetSeconds(self.recordPlayer.currentTime));
return nil;
}
return image;
}
另请注意,可以使用方法 generateCGImagesAsynchronouslyForTimes:completionHandler:
而不是 copyCGImageAtTime:actualTime:error:
(在 AVAssetImageGenerator
实例上) ) 异步执行图像生成。
此代码示例在 AVPlayer
的 currentTime
生成屏幕截图,但也可以使用任何时间。
关于uiimage - 从附加到AVPlayer的CALayer获取UIImage(从视频播放中提取帧),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4294996/