我正在开发一个播放HLS视频并在UIView中呈现它的应用程序。
在确定的时间我想保存当前显示的视频图像的图片。为此,我开始一个图像上下文图形,在上下文中绘制UIView层次结构,并使用UIGraphicsGetImageFromCurrentImageContext方法将其保存在UIImage中。
这项工作在iOS模拟器上非常好,渲染图像非常完美。但在设备上渲染的图像完全是白色的。
任何人都知道为什么它不适用于设备? 或者,是否有一种工作方式可以在设备上截取HLS视频的屏幕截图?
感谢您的帮助。
答案 0 :(得分:1)
我能够通过向AVPlayerItem添加AVPlayerItemVideoOutput对象来找到保存HLS直播流的屏幕截图的方法。
在初始化中:
self.output = AVPlayerItemVideoOutput(pixelBufferAttributes:
Dictionary<String, AnyObject>())
playerItem.addOutput(output!)
保存屏幕截图:
guard let time = self.player?.currentTime() else { return }
guard let pixelBuffer = self.output?.copyPixelBufferForItemTime(time,
itemTimeForDisplay: nil) else { return }
let ciImage = CIImage(CVPixelBuffer: pixelBuffer)
let temporaryContext = CIContext(options: nil)
let rect = CGRectMake(0, 0,
CGFloat(CVPixelBufferGetWidth(pixelBuffer)),
CGFloat(CVPixelBufferGetHeight(pixelBuffer)))
let videoImage = temporaryContext.createCGImage(ciImage, fromRect: rect)
let image = UIImage(CGImage: videoImage)
UIImageWriteToSavedPhotosAlbum(image, nil, nil, nil)
这似乎不适用于模拟器,但在设备上运行正常。代码在Swift 2中,但应该直接转换为obj-c或Swift 1.x。
答案 1 :(得分:0)
人们已经尝试过,并且失败了(像我一样),显然是因为HLS的性质。请参阅:http://blog.denivip.ru/index.php/2012/12/screen-capture-in-ios/?lang=en