PQVideoSnapshotUtil.swift 4.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. //
  2. // PQVideoSnapshotUtil.swift
  3. // PQSpeed
  4. //
  5. // Created by SanW on 2020/8/14.
  6. // Copyright © 2020 BytesFlow. All rights reserved.
  7. //
  8. import AVFoundation
  9. import AVKit
  10. import UIKit
  11. public class PQVideoSnapshotUtil: NSObject {
  12. /// AVPlayer截屏
  13. /// - Parameter playerItem: <#playerItem description#>
  14. /// - Returns: <#description#>
  15. public class func snapshotImage(avPlayer: AVPlayer, complateHandle: @escaping (_ image: UIImage?) -> Void) {
  16. guard let playerItem = avPlayer.currentItem else { // playerItem is AVPlayerItem
  17. complateHandle(nil)
  18. return
  19. }
  20. let videoOutput = AVPlayerItemVideoOutput(pixelBufferAttributes: nil)
  21. playerItem.add(videoOutput)
  22. let time = videoOutput.itemTime(forHostTime: CACurrentMediaTime())
  23. if videoOutput.hasNewPixelBuffer(forItemTime: time) {
  24. let lastSnapshotPixelBuffer = videoOutput.copyPixelBuffer(forItemTime: time, itemTimeForDisplay: nil)
  25. if lastSnapshotPixelBuffer != nil {
  26. let ciImage = CIImage(cvPixelBuffer: lastSnapshotPixelBuffer!)
  27. let context = CIContext(options: nil)
  28. let rect = CGRect(x: CGFloat(0), y: CGFloat(0), width: CGFloat(CVPixelBufferGetWidth(lastSnapshotPixelBuffer!)), height: CGFloat(CVPixelBufferGetHeight(lastSnapshotPixelBuffer!)))
  29. let cgImage = context.createCGImage(ciImage, from: rect)
  30. if cgImage != nil {
  31. complateHandle(UIImage(cgImage: cgImage!))
  32. return
  33. }
  34. }
  35. } else {
  36. complateHandle(nil)
  37. }
  38. }
  39. /// 非m3u8视频截屏
  40. /// - Parameters:
  41. /// - videoURL: 视频地址
  42. /// - time: 视频某个时间点
  43. /// - Returns: <#description#>
  44. public class func videoSnapshot(videoURL: URL, time: TimeInterval) -> UIImage? {
  45. let asset = AVURLAsset(url: videoURL, options: avAssertOptions)
  46. let assetImageGenerator = AVAssetImageGenerator(asset: asset)
  47. assetImageGenerator.appliesPreferredTrackTransform = true
  48. assetImageGenerator.requestedTimeToleranceBefore = CMTime.zero
  49. assetImageGenerator.requestedTimeToleranceAfter = CMTime.zero
  50. assetImageGenerator.apertureMode = .encodedPixels
  51. let thumbnailCGImage: CGImage?
  52. let thumbnailImageTime: CFTimeInterval = time
  53. var thumbnailImage: UIImage?
  54. do {
  55. thumbnailCGImage = try assetImageGenerator.copyCGImage(at: CMTimeMake(value: Int64(thumbnailImageTime), timescale: 1), actualTime: nil)
  56. if let cgImage = thumbnailCGImage {
  57. thumbnailImage = UIImage(cgImage: cgImage)
  58. }
  59. } catch {}
  60. return thumbnailImage
  61. }
  62. /// 获取非m3u8多张视频截图
  63. /// - Parameters:
  64. /// - videoURL: 视频地址
  65. /// - duration: 视频时长
  66. /// - count: 截取数量
  67. /// - Returns: <#description#>
  68. public class func videoSnapshot(videoURL: URL, duration: TimeInterval, count: Int, complateHandle: @escaping ([UIImage]?) -> Void) {
  69. DispatchQueue.global().async {
  70. var images: [UIImage]? = Array()
  71. let asset = AVURLAsset(url: videoURL, options: avAssertOptions)
  72. let assetImageGenerator = AVAssetImageGenerator(asset: asset)
  73. assetImageGenerator.requestedTimeToleranceBefore = CMTime.zero
  74. assetImageGenerator.requestedTimeToleranceAfter = CMTime.zero
  75. assetImageGenerator.appliesPreferredTrackTransform = true
  76. assetImageGenerator.apertureMode = .encodedPixels
  77. for index in 0...count - 1 {
  78. let thumbnailCGImage: CGImage?
  79. let thumbnailImageTime: CFTimeInterval = ((duration / Double(count)) * Double(index))
  80. BFLog(message: "截取视频时长 =(\(videoURL),duration = \(duration),count = \(count),line = \(thumbnailImageTime)")
  81. do {
  82. thumbnailCGImage = try assetImageGenerator.copyCGImage(at: CMTimeMake(value: Int64(thumbnailImageTime), timescale: 1), actualTime: nil)
  83. if let cgImage = thumbnailCGImage {
  84. images?.append(UIImage(cgImage: cgImage))
  85. }
  86. } catch {}
  87. }
  88. complateHandle(images)
  89. }
  90. }
  91. }