使用iOS设备从HLS视频流中截取屏幕截图

时间:2014-07-24 12:40:41

标签: ios objective-c video stream cgcontext

我正在开发一个播放HLS视频并在UIView中呈现它的应用程序。

在确定的时间我想保存当前显示的视频图像的图片。为此,我开始一个图像上下文图形,在上下文中绘制UIView层次结构,并使用UIGraphicsGetImageFromCurrentImageContext方法将其保存在UIImage中。

这项工作在iOS模拟器上非常好,渲染图像非常完美。但在设备上渲染的图像完全是白色的。

任何人都知道为什么它不适用于设备? 或者,是否有一种工作方式可以在设备上截取HLS视频的屏幕截图?

感谢您的帮助。

2 个答案:

答案 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