2016-09-16 1 views
1

Я пытаюсь создать эскизы изображений из видео, используя следующий код. Он генерирует UIImages, но изображения все одинаковы в разное время. Например, для видео, которое длится 3 секунды, оно будет генерировать 6 изображений, но все изображения являются одним и тем же изображением для самого начала видео. Любые идеи о том, что я сделал неправильно?Сгенерировать изображения из AVAssetImageGenerator

let asset = AVAsset(url: videoURL) 
       let imageGenerator = AVAssetImageGenerator(asset: asset) 

       let scale = 2 
       let step = 1 
       let duration = Int(CMTimeGetSeconds(asset.duration) * Double(scale)) 
       var epoches = [NSValue]() 
       for i in stride(from: 1, to: duration, by: step) { 
        //let time = CMTimeMake(Int64(i), Int32(scale)) 
        let time = CMTimeMakeWithSeconds(Double(i)/Double(scale), Int32(scale)) 
        let cgImage = try! imageGenerator.copyCGImage(at: time, actualTime: nil) 
        let uiImage = UIImage(cgImage: cgImage) 
        self?.imagePool.append(uiImage) 
        epoches.append(NSValue(time: time)) 
       } 

ответ

3

По умолчанию AVAssetImageGenerator дает себе очень щедрые допуски при выборке кадров в течение заданного времени. Если использование используется actualTime, вы увидите на практике, что это что-то вроде одной или двух секунд, хотя технически это kCMTimeFlags_PositiveInfinity, поэтому в коротком видео половина ваших кадров будет дублироваться.

Так установить допуски на что-то меньше, чтобы увидеть уникальные кадры:

imageGenerator.requestedTimeToleranceBefore = CMTimeMake(1, 15) 
imageGenerator.requestedTimeToleranceAfter = CMTimeMake(1, 15) 
+0

работает как шарм! Спасибо man –

+0

Для меня бесполезно менять знаменатель, но установка меньшего числителя, такого как CMTimeMake (0,01, 1), сделала трюк. – Varrry

+0

Странно! То, что вы сделали, должно быть эквивалентно 'CMTimeMake (1, 100)'! –