ios网页视频抓取工具(iOS中截屏点击按钮实现3种截屏方法对应三种不同应用场景)
优采云 发布时间: 2022-03-17 17:14ios网页视频抓取工具(iOS中截屏点击按钮实现3种截屏方法对应三种不同应用场景)
最近,我遇到了一个点击按钮对直播视频流进行截图的功能。查了网上的资料,总结了iOS中截图相关的知识,然后自己做了一个demo。
该demo主要实现了三种截图方式,分别对应三种不同的应用场景。
1、imageView截图,这个截图方法可以用来截取项目中的控件,截取的控件可以包括UIImageView、UIView等,截图方法如下:
-(UIImage *)screenshotsWithView:(UIView *)view{
UIGraphicsBeginImageContextWithOptions(view.frame.size, NO, 0.0);
[view.layer renderInContext:UIGraphicsGetCurrentContext()];
UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return image;
}
2、MP4格式视频流截图,即获取MP4格式视频流中的一帧。拦截方法如下:
-(UIImage *)screenshotsMP4WithCurrentTime:(CMTime)currentTime videoUrl:(NSString *)url{
AVURLAsset * asset = [[AVURLAsset alloc] initWithURL:[NSURL URLWithString:url] options:nil];
AVAssetImageGenerator * gen = [[AVAssetImageGenerator alloc] initWithAsset:asset];
gen.appliesPreferredTrackTransform = YES;
gen.requestedTimeToleranceAfter = kCMTimeZero;
gen.requestedTimeToleranceBefore = kCMTimeZero;
CMTime time = CMTimeMakeWithSeconds(CMTimeGetSeconds(currentTime), 600);
NSError * error = nil;
CMTime actualTime;
CGImageRef imageRef = [gen copyCGImageAtTime:time actualTime:&actualTime error:&error];
UIImage * image = [[UIImage alloc] initWithCGImage:imageRef];
return image;
}
不知道这种方法是否仅限于MP4格式的视频,但是可以肯定的是,MP4截取某帧的方法不适用于m3u8格式的视频流。
3、m3u8格式视频流截图。方法如下:
-(UIImage *)screenshotsm3u8WithCurrentTime:(CMTime)currentTime playerItemVideoOutput:(AVPlayerItemVideoOutput *)output{
CVPixelBufferRef pixelBuffer = [output copyPixelBufferForItemTime:currentTime itemTimeForDisplay:nil];
CIImage *ciImage = [CIImage imageWithCVPixelBuffer:pixelBuffer];
CIContext *temporaryContext = [CIContext contextWithOptions:nil];
CGImageRef videoImage = [temporaryContext createCGImage:ciImage
fromRect:CGRectMake(0, 0,
CVPixelBufferGetWidth(pixelBuffer),
CVPixelBufferGetHeight(pixelBuffer))];
UIImage *frameImg = [UIImage imageWithCGImage:videoImage];
CGImageRelease(videoImage);
CVBufferRelease(pixelBuffer);
return frameImg;
}
需要特别指出的两个释放方法如果不调用(用 Instruments 调试)会导致内存泄漏。
还有一点需要注意的是,m3u8格式的视频流在截取的时候需要传入一个AVPlayerItemVideoOutput对象。此对象必须在初始化 AVPlayerItem 时设置。如果以临时变量的形式传入,则可能拦截失败。
可以直接在截图事件中调用上述方法获取截取的图片。演示链接地址: