2017-02-28 118 views
4

我试图从Swift中的视频中提取帧作为UIImages。我发现了几个Objective C解决方案,但我在Swift中找不到任何东西。假设以下内容是正确的,那么有人可以帮助我将以下内容转换为Swift,或者让我自己承担如何做到这一点?迅速从视频中提取帧

- (UIImage *)imageFromVideo:(NSURL *)videoURL atTime:(NSTimeInterval)time { 

    // courtesy of memmons 
    // http://stackoverflow.com/questions/1518668/grabbing-the-first-frame-of-a-video-from-uiimagepickercontroller 

    AVURLAsset *asset = [[AVURLAsset alloc] initWithURL:videoURL options:nil]; 
    NSParameterAssert(asset); 
    AVAssetImageGenerator *assetIG = 
    [[AVAssetImageGenerator alloc] initWithAsset:asset]; 
    assetIG.appliesPreferredTrackTransform = YES; 
    assetIG.apertureMode = AVAssetImageGeneratorApertureModeEncodedPixels; 

    CGImageRef thumbnailImageRef = NULL; 
    CFTimeInterval thumbnailImageTime = time; 
    NSError *igError = nil; 
    thumbnailImageRef = 
    [assetIG copyCGImageAtTime:CMTimeMake(thumbnailImageTime, 60) 
        actualTime:NULL 
         error:&igError]; 

    if (!thumbnailImageRef) 
     NSLog(@"thumbnailImageGenerationError %@", igError); 

    UIImage *image = thumbnailImageRef 
    ? [[UIImage alloc] initWithCGImage:thumbnailImageRef] 
    : nil; 

    return image; 
} 
+0

我从来没有为自己试过这个,但我希望[this](https://objectivec2swift.com/)能帮助你 – UsamaMan

回答

5

它确实工作。

func imageFromVideo(url: URL, at time: TimeInterval) -> UIImage? { 
    let asset = AVURLAsset(url: url) 

    let assetIG = AVAssetImageGenerator(asset: asset) 
    assetIG.appliesPreferredTrackTransform = true 
    assetIG.apertureMode = AVAssetImageGeneratorApertureModeEncodedPixels 

    let cmTime = CMTime(seconds: time, preferredTimescale: 60) 
    let thumbnailImageRef: CGImage 
    do { 
     thumbnailImageRef = try assetIG.copyCGImage(at: cmTime, actualTime: nil) 
    } catch let error { 
     print("Error: \(error)") 
     return nil 
    } 

    return UIImage(cgImage: thumbnailImageRef) 
} 

但请记住,此功能是同步的,最好不要在主队列上调用它。

您可以执行此:

DispatchQueue.global(qos: .background).async { 
    let image = self.imageFromVideo(url: url, at: 0) 

    DispatchQueue.main.async { 
     self.imageView.image = image 
    } 
} 

或者使用generateCGImagesAsynchronously代替copyCGImage