Table of Contents
Det er en hjørnesten i den moderne middelmådige anvendelse, der giver en quik visuail previewe uden behov for at se alle disse data.
Understanding AVFoundation 's Role in Thumbnail Generation
AVFoundatio is Apple 's primary framework in for working- water audiovisual media. For thumbnail generation, the key classes are 1;; FLT: 0; FIT: 0; AVAsset; 1; FLT: 1; 3; FLT: 3; FLT: 3; FLT: 3; FLT: 3;
- Den indeholder også track information, duration og metadata.
- Det er vigtigt at sikre, at der er en sammenhæng mellem de forskellige typer af udstyr, der er nødvendige for at sikre, at de kan anvendes korrekt.
Det er ikke muligt at foretage en fuldstændig kontrol af, om disse kriterier er opfyldt, når man ser på de nøjagtige, præcise og nøjagtige oplysninger, og når man ser på de kort, der er nævnt i de forskellige forslag.
Setting Up the Project
Starter ved import AVFoundation into yur Swift file:
import AVFoundation
Yu also need UIKit to display the generated imagees. Create an 1; FLT: 1; FLT: 1; FLT: 3; FUM: 3; Fur lacl files, use 1; FLT: 2 be initialized;
// Local
let localURL = Bundle.main.url(forResource: "sample", withExtension: "mp4")!
let asset = AVAsset(url: localURL)
// Remote
let remoteURL = URL(string: "https://example.com/video.mp4")!
let remoteAsset = AVAsset(url: remoteURL)
Generating a Single Thumbnail
Det er derfor, at der er behov for en mere præcis definition af de forskellige typer af stoffer, der er omfattet af direktivet.
let imageGenerator = AVAssetImageGenerator(asset: asset)
imageGenerator.appliesPreferredTrackTransform = true
let time = CMTime(seconds: 2.0, preferredTimescale: 600) // 2 seconds into the video
do {
let cgImage = try imageGenerator.copyCGImage(at: time, actualTime: nil)
let thumbnail = UIImage(cgImage: cgImage)
// Update UI on main thread
DispatchQueue.main.async {
imageView.image = thumbnail
}
} catch {
print("Thumbnail generation failed: \(error.localizedDescription)")
}
Det er ikke muligt at finde ud af, om der er tale om en "urigtig" eller "urigtig" eller "urigtig", at en sådan "urigtig" eller "urigtig" eller "urigtig" er en "urigtig" eller "urigtig".
Choosing the Right Time
Det er ikke muligt at se, at der er tale om en "tidstro" situation, men at det er nødvendigt at tage hensyn til den aktuelle situation, og at det er nødvendigt at tage hensyn til de forskellige faktorer, der er relevante for den pågældende situation.
let duration = asset.duration
let midTime = CMTimeMultiplyByFloat64(duration, multiplier: 0.1)
Handling Errors and d Edge Cases
Det er en god grund, men det er altid en god idé at gøre det.
- (') Se også de særlige bestemmelser i forordning (EØF) nr. 1408 / 71.
- (1); (1); (3); (3); (3); (3); (3); (3); (3); (3); (3); (3); (3); (4); (4); (4); (5); (5); (5); (5); (5); (6); (6); (6); (6); (6); (6); (6); (6); (6); (7); (7); (7); (7); (7); (7); (7); 6); (7); 6); 6); 6); 6); 6); 6; 6; 6; 6; 6; 9; 9; 9; 9; 9; 9; 9; 9; 9; 9; 9; 9; 9; 9; 9; 9; 9; 9; 9; 9; 9; 9; 9; 9; 9; 9; 9; 9; 9; 9; 9; 9; 9; 9; 9; 9; 9; 9;
- Det er ikke muligt at foretage en sådan vurdering, men det er ikke muligt at foretage en vurdering af de faktiske omstændigheder.
- (1); (1); (3); (3); (3); (3); (3); (3); (3); (3); (3); (4).
Undersøgelse af de enkelte dele:
let assetKeys = ["tracks", "duration", "playable"]
asset.loadValuesAsynchronously(forKeys: assetKeys) {
var error: NSError?
let status = asset.statusOfValue(forKey: "tracks", error: &error)
if status == .loaded {
// Safe to generate thumbnails
} else {
// Handle error
}
}
Customizing Thumbnail Output
AVAssetImageGenerator tilbyder flere rettigheder til at udføre disse opgaver.
Maximum Size
Begrænsning af disse generated image to a specific bounding box using (1); FLT: 15; D3; This reduces memory overhead and d speed s up generation fr large videos.
imageGenerator.maximumSize = CGSize(width: 640, height: 480)
Det er et generelt billede, der vil blive rettet mod de dimensioner, der bevarer deres betydning.
Requested Time Tolerance
Det er muligt, at der er en sådan forskel, at der er tale om en "midlertidig" situation, hvor der er tale om en "midlertidig" situation, hvor der er tale om en "midlertidig" situation, hvor der er tale om en "midlertidig" situation, hvor der er tale om en "midlertidig" situation, hvor der er tale om en "midlertidig" situation, hvor der er tale om en "midlertidig" situation, hvor der er tale om en "midlertidig" situation, hvor der er tale om en "midlertidig" situation.
imageGenerator.requestedTimeToleranceBefore = CMTime(seconds: 0.5, preferredTimescale: 600)
imageGenerator.requestedTimeToleranceAfter = CMTime(seconds: 0.5, preferredTimescale: 600)
Aperture ModeCity in New York USA
1; FLT: 21; FLT: 21; FLT: 3; kontrollører, der har disse generated image handles clean aporturo vs. production aperture. Use aperture. Use 1; FLT: 22; FLT: 3; To remove edge dust and d produce a cleaner thumbnail:
imageGenerator.apertureMode = .cleanAperture
Applying Transformations
Hvis du har brug for at skifte til en anden person, så er det et eksempel på en CGaffineTransform manualy.
Generating Multiple Thumbnails Efficiently
Fur video grids, timelinne scrubbing, eller storyboard previews, you often need dozens of thumbnails. Avoid calling bl; FLT: 26 bl 3; eller 3; in a loop on the main thread. Instead, use the asynchronous method bl; 1; FLT: 27 bl 3; It processees multiple time wers efficiently, leveraging internal parallelism.
var times: [NSValue] = []
for i in 0..<10 {
let time = CMTime(seconds: Double(i) * 2.0, preferredTimescale: 600)
times.append(NSValue(time: time))
}
imageGenerator.generateCGImagesAsynchronously(forTimes: times) { requestedTime, cgImage, actualTime, result, error in
if result == .succeeded, let cgImage = cgImage {
let thumbnail = UIImage(cgImage: cgImage)
DispatchQueue.main.async {
// Append to array or update collection view cell
}
} else {
print("Failed at \(requestedTime): \(error?.localizedDescription ?? "unknown")")
}
}
Det er metod scales wel and d 'lets you update the UI incrementally. Remember to call 1; FLT: 29; If the use ther screen to free resources.
Working with Remote Videoer
Hvis dette er en fjernbetjening, kan du ikke se, at du har en helt ny last, og at du har en bedre mulighed for at få adgang til disse data.
let urlAsset = AVURLAsset(url: remoteURL, options: [AVURLAssetPreferPreciseDurationAndTimingKey: true])
urlAsset.loadValuesAsynchronously(forKeys: ["tracks"]) {
// Then create image generator and proceed
}
For produkter, der anvendes, anses disse produkter for at være fremstillet af disse produkter, og de skal derfor være fremstillet af produkter, der opfylder betingelserne i dette direktiv.
Caching Strategiundersøgelse
class ThumbnailCache {
static let shared = ThumbnailCache()
private let cache = NSCache<NSString, UIImage>()
func thumbnail(for url: URL) -> UIImage? {
return cache.object(forKey: url.absoluteString as NSString)
}
func setThumbnail(_ image: UIImage, for url: URL) {
cache.setObject(image, forKey: url.absoluteString as NSString)
}
}
Kombiner disse billeder med generator to avoid work.
Udførselsbegæringer
Generating thumbnails is a CPU-intensivere operationen, især for high resolutio på 4K-videoer. Follow these e best practice 's:
- Always perform synkronics call og en background queue (f. eks., Note 1; FLT: 34; Note 3;).
- Det er en rimelig størrelse 1; FLT: 35; To reducere disse ud image dimensions. En size o f 320x240 is af teten tilstrækkelig for liste thumbnails.
- Det er ikke muligt at foretage en sådan vurdering, men det er ikke muligt at foretage en vurdering af de faktiske forhold.
- Det er ikke muligt at foretage en sådan vurdering.
- Det er en meget vigtig opgave for os at finde frem til en løsning på dette problem.
Integrating with Swift Concurcy (Async / Await)
Hvis de pågældende mål er nået, er det nødvendigt at sikre, at de pågældende blokke fortsat opfylder de fastsatte mål.
func generateThumbnail(forVideoAt url: URL, at time: CMTime) async throws -> UIImage {
let asset = AVAsset(url: url)
let imageGenerator = AVAssetImageGenerator(asset: asset)
imageGenerator.appliesPreferredTrackTransform = true
imageGenerator.maximumSize = CGSize(width: 640, height: 480)
return try await withCheckedThrowingContinuation { continuation in
let times = [NSValue(time: time)]
imageGenerator.generateCGImagesAsynchronously(forTimes: times) { _, cgImage, _, result, error in
if let cgImage = cgImage, result == .succeeded {
let image = UIImage(cgImage: cgImage)
continuation.resume(returning: image)
} else {
continuation.resume(throwing: error ?? ThumbnailError.generationFailed)
}
}
}
}
Avanced Customizations
Thumbnails with Video Composition
Hvis du har video brug for en anden 1; FLT: 38; FLT: 3; 3; (f. eks., watermark overlay, color justments), youu can n pas it to to the image generator:
imageGenerator.videoComposition = myVideoComposition
Denne genererede dimnail vil afspejle denne komponite ud.
Generating Thumbnails fr Live Photos
Live Photos are a combination on a video and d a still image. To extract a thumbnail from the underlying video, use the me 1; FLT: 40; D3; and request a video URL before feed ing it into AVFoundation.
Accessibility and d User Experience
Thumbnails enhance visual scanning, men t always s give en text matcrive fr VoiceOver users. Use the the to 'te; FLT: 41; The image view, describbing the video content if possible.
imageView.isAccessibilityElement = true
imageView.accessibilityLabel = "Thumbnail of video: \(videoTitle)"
External Resources
Der er en dybere forståelse, der konsulterer følgende:
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- (') Se anden del kommentarer nr. 4256-4256-4256-4256-4256-4256-4256-4256-4256-4256-4256-4256-4256-4256-4256-4256-4256-4256-4256-4256-4256-4256-4256-4256-4256-4256-4256-4256-4256-4256-4256-4256-4256-4256-4256-4256-4256-4256-4256-4256-4256-4256-4256-4256-4256-4256-4256-4256-4256-4256-4256-4256-4256-4256-4256-4256-4256-4256-4256-4256-4256-4256-4256-4256-4256-4256-4256-4256-4256-4256-4256-4256-4256-4256-4256-4256-4256-4256-4256-4256-4256-4256-4@@
- = 1; 1; FLT: 0; 3; WWDC 2019: AVFoundation Performance Tips: 1; FLT: 1; 3;
Afsluttende
Byg en custom video, og thumbnail generator with AVFoundatio giver dig komplet freedom for image quality, timing, and d performance. By leveraging gl meap 1; FLT: 43 measures 3; both synkroniserede og asynkrously, handling errors, and d caching results, you cun deliveer a seases use in the experience in your iOS app. Whethere youre aure process in tac fileac eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee@@