ios网页视频抓取工具(iOS中截屏点击按钮实现3种截屏方法对应三种不同应用场景)

优采云 发布时间: 2022-03-17 17:14

  ios网页视频抓取工具(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 时设置。如果以临时变量的形式传入,则可能拦截失败。

  可以直接在截图事件中调用上述方法获取截取的图片。演示链接地址:

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线