iOS:如何拍摄AVplayer的屏幕截图?

时间:2017-04-29 07:17:38

标签: swift3

在我的项目中播放视频。我为自定义控件创建了自定义视频播放器(即AVplayerLayer而不是AVPlayerViewController)。问题是当我尝试截取videoPlayer的屏幕截图时,它会返回黑色图像。

这是我用来拍摄截图的代码

func captureScreen() -> UIImage? {
    UIGraphicsBeginImageContextWithOptions(view.bounds.size, false, UIScreen.main.scale)
    view.layer.render(in: UIGraphicsGetCurrentContext()!)
    let image = UIGraphicsGetImageFromCurrentImageContext()
    UIGraphicsEndImageContext()
    return image
}

任何建议都会非常有用!

3 个答案:

答案 0 :(得分:0)

由于您使用的是AVPlayer而不是AVAssetReader+AVAssetReaderTrackOutput(可以在播放时拍摄屏幕截图)

我想这会对你有所帮助。

if let item = player.currentItem {
    let imageGenerator = AVAssetImageGenerator(asset: item.asset)
    if let cgImage = try? imageGenerator.copyCGImage(at: item.currentTime(), actualTime: nil) {
        let image = UIImage(cgImage: cgImage)
    }
}

提示:您可以按自己的方式获得该项目。 (例如,在创建AVPlayer时也一样)

编译器指示您的安全性假设。 (你当然可以强行打开)

答案 1 :(得分:0)

如果需要拍摄包含AVPlayerLayer的视图的快照以用于动画/冻结状态,也可以使用view.snapshotView(afterScreenUpdates:)

这将返回一个视图,其中包含您的视图的屏幕快照。 与UIVisualEffectView结合使用非常方便! :)

答案 2 :(得分:-1)

试试这个,希望它能帮到你......

extension UIView
{
  public func getSnapshotImage() -> UIImage
  {
    UIGraphicsBeginImageContextWithOptions(self.bounds.size, self.isOpaque, 0)
    self.drawHierarchy(in: self.bounds, afterScreenUpdates: false)
    let snapshotImage: UIImage = UIGraphicsGetImageFromCurrentImageContext()!
    UIGraphicsEndImageContext()
    return snapshotImage
  }
}

用法:

let Snap = self.VideoPlayerView.getSnapshotImage