Ang mga video na thumbnail ay isang batong panulok ng mga modernong media-rich application, na nagbibigay sa mga gumagamit ng isang mabilis na visual preview nang hindi na kailangang maglaro ng buong video. sa iOS development, ang AVFoundation ay nagbibigay ng pinaka-maaksyon at naibabagay na mga kasangkapan para sa pagkuha ng mga larawan ng thumbnail. Ang artikulong ito ay dumadaan sa pagtatayo ng isang custom video na thumannail generator na maaaring humawak ng real-world senaryo na periornal at remote files, caching paghawak, at pagganap ng performing Swiftwiftom at AVFoundation.

Pag - unawa sa mga Eksperimento ng AVFoundation sa Henerasyon ng Thumbnail

AVFoundation ang Apple archions pangunahing balangkas para sa paggawa ng audiovisual media. para sa henerasyong thumbandnail, ang mga pangunahing klase ay AVasset at AssetImageGenerator[.

  • : representasyon ng isang timed audiovisual asset (isang lokal o malayong video). Naglalaman ito ng impormasyong track, tagal, at metadata.
  • AVassetImageGenerator: Naglalaan ng mga paraan upang makakuha ng mga CGImagageRef mula sa asset sa espesipikong mga pagitan ng panahon. hinggil ito sa oryentasyon ng video, maglalapat ng mga pagbabago sa kulay space, at sumusuporta sa asynchronous na maramihang henerasyon.

Ang tuwirang paggamit sa mga klaseng ito ay nagbibigay sa iyo ng ganap na kontrol sa sukat ng imahe, katumpakan ng oras, at pagbabago, hindi tulad ng UIKit shortcuts na kadalasang itinatago ang mga pagpipiliang pagsasaayos.

Pagtatakda ng Proyekto

Magsimula sa pag - aangkat ng AVFoundation sa iyong Swift file:

import AVFoundation

Kailangan mo rin ang UIKit upang maitanghal ang mga likhang imahe.Linhag ang isang mula sa isang URL. Para sa mga lokal na file, gamitin . Para sa mga remote video, gamitin at tiyakin ang asset ay maaaring i-publish:

// 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)

Paggulang sa Isang Iisang Thumbnail

Upang makalikha ng isang thumbnail sa isang tiyak na panahon, lumikha ng isang at tumawag . Ang pamamaraang ito ay synchronous at dapat na patakbuhin mula sa pangunahing sinulid upang maiwasan ang pagharang sa UI.

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)")
}

[ Ang pagtatakda sa ay tumitiyak sa resultang imahe na may paggalang sa video rotation metadata (portrait vs. lands).

Pagpili ng Tamang Panahon

Ang mga thumbnail ay kadalasang kinukuha sa simula ng isang video, ngunit isaalang-alang ang paggamit ng panahon na kumakatawan sa nilalamang ⁇ i ⁇ e.g., 10% sa tagal. Upang makakuha ng makabuluhang time point, query the assetiviers tumagal:

let duration = asset.duration
let midTime = CMTimeMultiplyByFloat64(duration, multiplier: 0.1)

Pagharap sa mga Pagkakamali at mga Kaso ng Panggagaya

Ang salinlahi ng Thumbnail ay maaaring mabigo sa ilang kadahilanan. laging pakitunguhan nang maganda ang mga pagkakamali at maglaan ng hindi mabuting UI.

  • [[Talaksan:] Ang video ay maaaring mabahiran o kaya ang URL Distance.
  • [ Ang ilang asset ay naglalaman lamang ng audio; tingnan ].
  • Ang panahon ay hindi na dapat limitahan: Ang pag-uuri sa hinihinging panahon ay nasa pagitan ng at ang assetifics ay tumatagal.
  • Mga pagkakamali sa paggawa: Maaaring hindi makapagkarga ng mga natanggal na asset. Gamitin bago gumawa ng mga thumbnail.

Halimbawa ng patiunang pag - aayos ng mahahalagang katangian:

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
 }
}

Pag - aayos ng Thumbnail

Ang AVASsetImageGenerator ay nag-aalok ng ilang mga katangian upang i-pino-tune ang imahe ng output.

Pagdami ng Maximum

Pagtakda ng larawan sa isang espesipikong kahon na may kasamang , na nakababawas sa memorya sa itaas at nagpapabilis sa mga henerasyon para sa malalaking video.

imageGenerator.maximumSize = CGSize(width: 640, height: 480)

Ang larawan na ginawa ay susukatin upang umangkop sa mga dimensiyong ito samantalang iniingatan ang proporsiyon na aspekto.

Kahilingang Pagpaparaya sa Oras

Sa default, ay ibinabalik ang eksaktong kuwadro sa hiniling na oras (o hangga't maaari).[Kakalakalan mo ng katumpakan para sa bilis sa pamamagitan ng pagtatakda at .[Para sa mga thumbnail, ang isang pagpayag ng 0.5 segundo ay kadalasang tinatanggap at mas mabilis:

imageGenerator.requestedTimeToleranceBefore = CMTime(seconds: 0.5, preferredTimescale: 600)
imageGenerator.requestedTimeToleranceAfter = CMTime(seconds: 0.5, preferredTimescale: 600)

Mode ng Aperture

Ang pagkontrol kung paano humahawak ang nalikhang larawan ng malinis na aperture vs. aperture ng produksiyon. Gamitin upang alisin ang alikabok sa gilid at makagawa ng mas malinis na thumnail:

imageGenerator.apertureMode = .cleanAperture

Pagkakapit ng mga Pagbabago

Kung kailangan mong umikot o i-flip ang imahe (hal.g., para sa isang espesipikong oryentasyon), gumamit ng Core Graphics transforms. Ang isang paraan ay ang pag-agaw ng hilaw na imahe at pagkatapos ay mag-pahid ng CGAffineTransform ng manu-mand. alternatibo, maaari kang magtakda sa (gaya ng ipinakita) at magtiwala sa mga asset customs natural orientation.

May - kahusayang Pinalalaki ang Maraming Bagay

Para sa mga video grid, timeline kisbing, o storyboard previews, madalas na kailangan mo ng dose-dosenang mga thumbnail. Iwasang tawagin sa isang loop sa pangunahing sinulid. sa halip, gamitin ang asynchronous method . Ito ay nagpoproseso ng multiple time requests sa mahusay, introgulating internalism.

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")")
 }
}

Ang paraang ito ay tumakal nang mabuti at hinahayaan kang i-update ang UI incrementally. Tandaan na tawagin kung iiwan ng gumagamit ang screen upang maging libre ang mapagkukunan.

Paggawa sa Malalayong Video

Kapag itinuro ng video na URL ang isang remote server, dapat mong hintayin na ang asset ay maging kumpletong naka-karga o kahit papaano ang impormasyong track nito ay makuha. Gamitin na may angkop na caching headers upang maiwasan ang paulit-ulit na mga download.

let urlAsset = AVURLAsset(url: remoteURL, options: [AVURLAssetPreferPreciseDurationAndTimingKey: true])
urlAsset.loadValuesAsynchronously(forKeys: ["tracks"]) {
 // Then create image generator and proceed
}

Para sa mga app ng produksiyon, isaalang-alang ang caching thumbnails sa disk upang ang paulit-ulit na pag-access sa parehong video ay hindi muling nagreresulta sa imahe. Gamitin o file stake na may tatak na ginagamit ang video na URL bilang isang susi.

Pag - alis sa Halimbawa ng Estratehiya

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)
 }
}

Ihalo ito sa apograpikong generator upang maiwasan ang gawaing redundant.

Mga Pag - aasikaso sa Pag - aasikaso

Ang Generating thumbnails ay isang CPU annitensive operation, lalo na para sa high phyberresolution 4K videos. Sundin ang mga pinakamahusay na gawaing ito:

  • Laging magsagawa ng sabay na mga tawag sa isang background queue (e.g., ).
  • Magtakda ng rason upang mabawasan ang output na mga dimensiyon ng imahe. Ang isang sukat na 320x240 ay kadalasang sapat para sa listahan ng mga thumbnail.
  • Gamitin upang payagan ang generator na makawala sa pinakamalapit na balangkas sa halip na malutas ang eksaktong decode.
  • Cancel sa anumang salinlahi ng mga ibon na walang - malay kapag naglaho ang tanawin.
  • Para sa pagpapakita sa isang tanawing pang-koleksiyon, lumikha ng mga thumbnail sa eksaktong sukat ng selula at iwasang muling mag-insthesize sa pangunahing sinulid.

Nakisama sa Swift Concurrency (Asyanc/Await)

Kung ang iyong app targets iOS 15+, maaari mong balutin ang blocking call sa isang pagpapatuloy para sa malinis na async/awatter code:

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)
 }
 }
 }
}

Patiunang mga Kaugalian

Mga Thumbnail na May Komposisyong Video

Kung ang iyong video ay gumagamit ng (e.g., watermark cafin, color adjustment), maaari mong ipasa ito sa photo generator:

imageGenerator.videoComposition = myVideoComposition

Ang nalikhang hinlalakinail ay magsasalamin sa elementong output.

Paggagana ng mga Thumbnail Para sa mga Buháy na Larawan

Ang Live Photos ay kombinasyon ng isang video at isang imahe pa rin. Upang makuha ang isang thumbnail mula sa nakapailalim na video, gamitin ang at humiling ng isang video URL bago ito i-subload sa AVFoundation.

Pagiging Madaling Mabili at Makaranasan

Pinabubuti ng mga Thumbnail ang visual scanning, ngunit palaging nagbibigay ng isang teksto na alternatibo para sa mga gumagamit ng Voice Over. Gamitin ang sa imahe, na inilalarawan ang nilalamang video kung maaari.

imageView.isAccessibilityElement = true
imageView.accessibilityLabel = "Thumbnail of video: \(videoTitle)"

Mga Yaman sa Labas

Para sa mas malalim na pagkaunawa, sumangguni sa sumusunod:

Pagsasaayos

Ang paggawa ng isang kinaugaliang video na cameraknail generator na may AVFoundation ay nagbibigay sa iyo ng ganap na kalayaan sa kalidad ng larawan, panahon, at pagganap. Kapuwa sa pamamagitan ng sabay - sabay na pagpoproseso ng lokal na mga file o remote video, paghawak ng mga pagkakamali, at pagsakit ng mga resulta, ikaw ay makapaghahatid ng isang karanasan sa paggamit ng pilipinas sa iyong iOS app. Kung ikaw ay nagpoproseso ng lokal na mga file o remote video, ang mga pamamaraan na nasasaklaw dito ay tutulong sa iyo na gumawa ng malutong, konteksto na mabilis na jawareactynastil at mahusay.