123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137 |
- #if !os(watchOS)
- import Foundation
- import AVKit
- #if canImport(MobileCoreServices)
- import MobileCoreServices
- #else
- import CoreServices
- #endif
- public struct AVAssetImageDataProvider: ImageDataProvider {
-
-
-
- public enum AVAssetImageDataProviderError: Error {
- case userCancelled
- case invalidImage(_ image: CGImage?)
- }
-
- public let assetImageGenerator: AVAssetImageGenerator
-
- public let time: CMTime
- private var internalKey: String {
- return (assetImageGenerator.asset as? AVURLAsset)?.url.absoluteString ?? UUID().uuidString
- }
-
- public var cacheKey: String {
- return "\(internalKey)_\(time.seconds)"
- }
-
-
-
-
- public init(assetImageGenerator: AVAssetImageGenerator, time: CMTime) {
- self.assetImageGenerator = assetImageGenerator
- self.time = time
- }
-
-
-
-
-
-
-
-
- public init(assetURL: URL, time: CMTime) {
- let asset = AVAsset(url: assetURL)
- let generator = AVAssetImageGenerator(asset: asset)
- self.init(assetImageGenerator: generator, time: time)
- }
-
-
-
-
-
-
-
-
-
- public init(assetURL: URL, seconds: TimeInterval) {
- let time = CMTime(seconds: seconds, preferredTimescale: 600)
- self.init(assetURL: assetURL, time: time)
- }
- public func data(handler: @escaping (Result<Data, Error>) -> Void) {
- assetImageGenerator.generateCGImagesAsynchronously(forTimes: [NSValue(time: time)]) {
- (requestedTime, image, imageTime, result, error) in
- if let error = error {
- handler(.failure(error))
- return
- }
- if result == .cancelled {
- handler(.failure(AVAssetImageDataProviderError.userCancelled))
- return
- }
- guard let cgImage = image, let data = cgImage.jpegData else {
- handler(.failure(AVAssetImageDataProviderError.invalidImage(image)))
- return
- }
- handler(.success(data))
- }
- }
- }
- extension CGImage {
- var jpegData: Data? {
- guard let mutableData = CFDataCreateMutable(nil, 0),
- let destination = CGImageDestinationCreateWithData(mutableData, kUTTypeJPEG, 1, nil)
- else {
- return nil
- }
- CGImageDestinationAddImage(destination, self, nil)
- guard CGImageDestinationFinalize(destination) else { return nil }
- return mutableData as Data
- }
- }
- #endif
|