Twi*_*wil 17 calayer uiimage avplayer
我用AVPlayer播放视频.它工作正常.
现在我想UIImage从视频播放中获取一个(当我按下按钮的时候).
附在我身上AVPlayer有一个CALayer用于显示我的视频UIView.我的想法是让一个UIImage从CALayer视频中播放.
我使用另一个问题的代码执行此操作:
来自CALayer的UIImage - 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;
}
Run Code Online (Sandbox Code Playgroud)
还要注意,可以使用该方法generateCGImagesAsynchronouslyForTimes:completionHandler:而不是copyCGImageAtTime:actualTime:error:(在实例上AVAssetImageGenerator)异步执行图像生成.
此代码示例在AVPlayers 处生成屏幕截图currentTime,但可以随时使用.
从avplayer获取图像的代码.
- (UIImage *)currentItemScreenShot
{
AVPlayer *abovePlayer = [abovePlayerView player];
CMTime time = [[abovePlayer currentItem] currentTime];
AVAsset *asset = [[[abovePlayerView player] currentItem] asset];
AVAssetImageGenerator *imageGenerator = [[AVAssetImageGenerator alloc] initWithAsset:asset];
if ([imageGenerator respondsToSelector:@selector(setRequestedTimeToleranceBefore:)] && [imageGenerator respondsToSelector:@selector(setRequestedTimeToleranceAfter:)]) {
[imageGenerator setRequestedTimeToleranceBefore:kCMTimeZero];
[imageGenerator setRequestedTimeToleranceAfter:kCMTimeZero];
}
CGImageRef imgRef = [imageGenerator copyCGImageAtTime:time
actualTime:NULL
error:NULL];
if (imgRef == nil) {
if ([imageGenerator respondsToSelector:@selector(setRequestedTimeToleranceBefore:)] && [imageGenerator respondsToSelector:@selector(setRequestedTimeToleranceAfter:)]) {
[imageGenerator setRequestedTimeToleranceBefore:kCMTimePositiveInfinity];
[imageGenerator setRequestedTimeToleranceAfter:kCMTimePositiveInfinity];
}
imgRef = [imageGenerator copyCGImageAtTime:time actualTime:NULL error:NULL];
}
UIImage *image = [[UIImage alloc] initWithCGImage:imgRef];
CGImageRelease(imgRef);
[imageGenerator release];
return [image autorelease];
}
Run Code Online (Sandbox Code Playgroud)
设置[imageGenerator setRequestedTimeToleranceBefore:kCMTimeZero],[imageGenerator setRequestedTimeToleranceAfter:kCMTimeZero]如果你需要精确的时间.
尝试使用 AVAssetImageGenerator 从指定实例的视频文件中获取图像:
AVURLAsset *asset=[[AVURLAsset alloc] initWithURL:[NSURL fileURLWithPath:[info objectForKey:@"UIImagePickerControllerReferenceURL"]] options:nil];
AVAssetImageGenerator *生成器 = [[AVAssetImageGenerator 分配] initWithAsset:asset];
生成器.appliesPreferredTrackTransform=TRUE;
[资产释放];
CMTime 拇指时间 = CMTimeMakeWithSeconds(0,30);
AVAssetImageGeneratorCompletionHandler 处理程序 = ^(CMTime requestsTime, CGImageRef im, CMTime effectiveTime, AVAssetImageGeneratorResult 结果, NSError *error){
if (结果!= AVAssetImageGeneratorSucceeded) {
}
UIImage *thumbImg = [[UIImage imageWithCGImage:im] 保留];
[发电机释放];