generateCGImagesAsynchronouslyForTimes 有时不会生成整个缩略图

swift

1个回答

写回答

13160365029

2025-06-19 11:00

+ 关注

Swift
Swift

使用 AVFoundation 中的 generateCGImagesAsynchronouslyForTimes 方法可以异步生成视频的缩略图。该方法可以根据传入的时间数组,在指定的时间点生成对应的缩略图。但是有时候会遇到一个问题,即生成的缩略图可能不完整,可能只包含部分内容。

这个问题的原因是 generateCGImagesAsynchronouslyForTimes 方法是异步执行的,它会在后台线程中生成缩略图。而在主线程中,可能会在缩略图还未生成完成时就直接使用它,导致只能获取到部分内容。

为了解决这个问题,可以通过使用 dispatch group 来确保缩略图生成完整后再使用。下面是一个示例代码:

Swift

import AVFoundation

func generateThumbnAIlImages() {

let url = URL(fileURLWithPath: "path_to_vIDEO_file")

let asset = AVURLAsset(url: url)

let generator = AVAssetImageGenerator(asset: asset)

let times = [NSValue(time: CMTime(seconds: 0, preferredTimescale: 1)),

NSValue(time: CMTime(seconds: 2, preferredTimescale: 1)),

NSValue(time: CMTime(seconds: 4, preferredTimescale: 1))]

let group = DispatchGroup()

for time in times {

group.enter()

generator.generateCGImagesAsynchronously(forTimes: [time]) { _, image, _, _, _ in

// 处理生成的缩略图

if let cgImage = image {

// 在这里可以对生成的缩略图进行处理或展示

// ...

}

group.leave()

}

}

group.notify(queue: DispatchQueue.mAIn) {

// 所有缩略图都生成完成后的回调

// 可以在这里进行一些收尾工作

// ...

}

}

在这个示例代码中,我们首先创建了一个 AVURLAsset 对象,用于表示视频文件。然后使用 AVAssetImageGenerator 对象生成缩略图。我们指定了三个时间点来生成缩略图,并通过 dispatch group 来确保所有缩略图都生成完成后再执行后续操作。

在生成缩略图的回调闭包中,我们可以对生成的缩略图进行处理或展示。在所有缩略图都生成完成后,会调用 group.notify 方法中的回调闭包,可以在这里进行一些收尾工作。

解决生成不完整缩略图的问题

通过使用 dispatch group,我们可以确保在缩略图生成完成后再使用它,从而解决了生成不完整缩略图的问题。这样可以保证我们获取到的缩略图是完整的,并且可以在主线程中使用它进行后续处理或展示。

使用 generateCGImagesAsynchronouslyForTimes 方法可以异步生成视频的缩略图,但有时可能会遇到生成不完整缩略图的问题。为了解决这个问题,可以使用 dispatch group 来确保缩略图生成完整后再使用。以上就是解决这个问题的示例代码和方法说明。

希望本文对你有所帮助,谢谢阅读!

举报有用(4分享收藏

Copyright © 2025 IZhiDa.com All Rights Reserved.

知答 版权所有 粤ICP备2023042255号