我正在开发一个应用程序,该应用程序播放HLS视频并在UIView中渲染它。
在确定的时间,我想保存当前显示的视频图像的图片。为此,我开始一个图像上下文图形,在上下文中绘制UIView层次结构,并使用UIGraphicsGetImageFromCurrentImageContext方法将其保存在一个UIImage中。
这个工作在iOS模拟器上真的很好,渲染的图像是完美的。但是在设备上渲染的图像是完全白色的。
有谁知道为什么它不能在设备上工作吗?或者,是否有一种工作方法可以在设备上截取HLS视频的截图?
感谢您的帮助
我能够找到一种方法来保存HLS直播流的屏幕截图,通过添加AVPlayerItemVideoOutput对象到AVPlayerItem。
在初始化: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。
人们尝试过,但失败了(像我一样),显然是因为HLS的性质。参见:http://blog.denivip.ru/index.php/2012/12/screen-capture-in-ios/?lang=en