let player = MPMoviePlayerController(contentURL: url)
let thumbnail = player.thumbnailImageAt(0, timeOption: .nearKeyFrame)
// 問題:會觸發視頻解碼、播放器初始化,產生可聞的聲音/卡頓
player.muted = true 也可能在解碼瞬間泄露音頻MPMoviePlayerController,建議用 AVAssetImageGeneratorlet asset = AVAsset(url: videoURL)
let generator = AVAssetImageGenerator(asset: asset)
generator.appliesPreferredTrackTransform = true
generator.maximumSize = CGSize(width: 300, height: 300)
generator.generateCGImagesAsynchronously(forTimes: [NSValue(time: CMTimeMake(value: 1, timescale: 60))]) { _, cgImage, _, _, error in
if let img = cgImage {
DispatchQueue.main.async { imageView.image = UIImage(cgImage: img) }
}
}
優點:無聲音、可指定時間點、支援后台生成。缺點:仍需下載視頻頭部數據。
ffmpeg -i input.mp4 -ss 00:00:01 -vframes 1 -q:v 2 thumb.jpg| 方案 | 延遲 | 聲音風險 | 帶寬 | 維護成本 |
|---|---|---|---|---|
| MPMoviePlayerController | 高 | 高 | 需下載視頻頭 | 已棄用 |
| AVAssetImageGenerator | 中 | 無 | 需下載視頻頭 | 低 |
| 服務端預生成 | 極低 | 無 | 僅圖片大小 | 需後端配合 |
結論:凡涉及列表/封面展示,**強制要求服務端提供縮略圖 URL**,客戶端僅做圖片加載。