Я пытаюсь получить эскиз (первого кадра) из видео, снятого с камеры iphone 3GS, чтобы я мог его отобразить. Как это сделать?
Получение эскиза из URL-адреса видео или данных в iOS
Ответ 1
Ответ на этот вопрос заключается в том, что теперь с 4.0 iOS можно получить эскизы, используя AVFoundation, следующий код, в котором URL-адрес класса является URL-адресом фильма, будет делать трюк (вы можете получить миниатюру в любое время, в пример его в момент времени 0)
-(void)generateImage
{
    AVURLAsset *asset=[[AVURLAsset alloc] initWithURL:self.url options:nil];
    AVAssetImageGenerator *generator = [[AVAssetImageGenerator alloc] initWithAsset:asset];
    generator.appliesPreferredTrackTransform=TRUE;
    [asset release];
    CMTime thumbTime = CMTimeMakeWithSeconds(0,30);
    AVAssetImageGeneratorCompletionHandler handler = ^(CMTime requestedTime, CGImageRef im, CMTime actualTime, AVAssetImageGeneratorResult result, NSError *error){
        if (result != AVAssetImageGeneratorSucceeded) {
            NSLog(@"couldn't generate thumbnail, error:%@", error);
        }
        [button setImage:[UIImage imageWithCGImage:im] forState:UIControlStateNormal];
        thumbImg=[[UIImage imageWithCGImage:im] retain];
        [generator release];
    };
    CGSize maxSize = CGSizeMake(320, 180);
    generator.maximumSize = maxSize;
    [generator generateCGImagesAsynchronouslyForTimes:[NSArray arrayWithObject:[NSValue valueWithCMTime:thumbTime]] completionHandler:handler];
}
		Ответ 2
-(UIImage *)generateThumbImage : (NSString *)filepath
{
    NSURL *url = [NSURL fileURLWithPath:filepath];
    AVAsset *asset = [AVAsset assetWithURL:url];
    AVAssetImageGenerator *imageGenerator = [[AVAssetImageGenerator alloc]initWithAsset:asset];
    imageGenerator.appliesPreferredTrackTransform = YES;
    CMTime time = [asset duration];
    time.value = 0;
    CGImageRef imageRef = [imageGenerator copyCGImageAtTime:time actualTime:NULL error:NULL];
    UIImage *thumbnail = [UIImage imageWithCGImage:imageRef];
    CGImageRelease(imageRef);  // CGImageRef won't be released by ARC
    return thumbnail;
}
вы можете получить фрейм, используя time.value, предположим, что вы хотите использовать 1-й кадр, а затем используйте
time.value = 1000 //Time in milliseconds
		Ответ 3
NSURL *videoURL = [NSURL fileURLWithPath:url];
MPMoviePlayerController *player = [[MPMoviePlayerController alloc] initWithContentURL:videoURL];
        UIImage *thumbnail = [player thumbnailImageAtTime:1.0 timeOption:MPMovieTimeOptionNearestKeyFrame];
        //Player autoplays audio on init
        [player stop];
        [player release];
Проверьте эту ссылку для альтернативы: thumbnailImageAtTime: теперь устарело - Какая альтернатива?
Ответ 4
Лучший метод, который я нашел... MPMoviePlayerController thumbnailImageAtTime:timeOption
Ответ 5
SWIFT 2.0
Вы можете генерировать быстрым двумя способами: 1. AVFoundation 2. MPMoviePlayerController
1. 
    func generateThumnail(url : NSURL) -> UIImage{
            var asset : AVAsset = AVAsset.assetWithURL(url) as AVAsset
            var assetImgGenerate : AVAssetImageGenerator = AVAssetImageGenerator(asset: asset)
            assetImgGenerate.appliesPreferredTrackTransform = true
            var error       : NSError? = nil
            var time        : CMTime = CMTimeMake(1, 30)
            var img         : CGImageRef = assetImgGenerate.copyCGImageAtTime(time, actualTime: nil, error: &error)
            var frameImg    : UIImage = UIImage(CGImage: img)!
            return frameImg
        }
2. 
    override func viewDidLoad() {
            super.viewDidLoad()
            var moviePlayer         : MPMoviePlayerController!  = MPMoviePlayerController(contentURL: moviePlayManager.movieURL)
            moviePlayer.view.frame   = CGRect(x: self.view.frame.origin.x, y: self.view.frame.origin.y, width:
                                       self.view.frame.size.width, height: self.view.frame.height)
            moviePlayer.fullscreen   = true
            moviePlayer.controlStyle = MPMovieControlStyle.None
            NSNotificationCenter.defaultCenter().addObserver(self,
        selector: "videoThumbnailIsAvailable:",
        name: MPMoviePlayerThumbnailImageRequestDidFinishNotification,
        object: nil)
        let thumbnailTimes = 3.0
        moviePlayer.requestThumbnailImagesAtTimes([thumbnailTimes],
                timeOption: .NearestKeyFrame)
        }
    func videoThumbnailIsAvailable(notification: NSNotification){
        if let player = moviePlayer{
            let thumbnail =
            notification.userInfo![MPMoviePlayerThumbnailImageKey] as? UIImage
            if let image = thumbnail{
                /* We got the thumbnail image. You can now use it here */
                println("Thumbnail image = \(image)")
            }
        }
		Ответ 6
Код Swift 2:
func previewImageForLocalVideo(url:NSURL) -> UIImage?
{
    let asset = AVAsset(URL: url)
    let imageGenerator = AVAssetImageGenerator(asset: asset)
    imageGenerator.appliesPreferredTrackTransform = true
    var time = asset.duration
    //If possible - take not the first frame (it could be completely black or white on camara videos)
    time.value = min(time.value, 2)
    do {
        let imageRef = try imageGenerator.copyCGImageAtTime(time, actualTime: nil)
        return UIImage(CGImage: imageRef)
    }
    catch let error as NSError
    {
        print("Image generation failed with error \(error)")
        return nil
    }
}
		Ответ 7
Для Swift 3.0
func createThumbnailOfVideoFromFileURL(_ strVideoURL: String) -> UIImage?{
let asset = AVAsset(url: URL(string: strVideoURL)!)
let assetImgGenerate = AVAssetImageGenerator(asset: asset)
assetImgGenerate.appliesPreferredTrackTransform = true
let time = CMTimeMakeWithSeconds(Float64(1), 100)
do {
  let img = try assetImgGenerate.copyCGImage(at: time, actualTime: nil)
  let thumbnail = UIImage(cgImage: img)
  return thumbnail
} catch {
  /* error handling here */
}
return nil   }
		Ответ 8
Возможно, это полезно для кого-то, кто сталкивается с той же проблемой. Мне нужно было простое решение для создания миниатюры для изображений, PDF файлов и видео. Чтобы решить эту проблему, я создал следующую библиотеку.
https://github.com/prine/ROThumbnailGenerator
Использование очень просто:
var thumbnailImage = ROThumbnail.getThumbnail(url)
Он имеет три разных реализации и в зависимости от расширения файла создает миниатюру. Вы можете легко добавить свою собственную реализацию, если вам нужен создатель миниатюр для другого расширения файла.
Ответ 9
Swift 2.1 Получение эскизов с требуемыми временными интервалами
func getPreviewImageForVideoAtURL(videoURL: NSURL, atInterval: Int) -> UIImage? {
    print("Taking pic at \(atInterval) second")
    let asset = AVAsset(URL: videoURL)
    let assetImgGenerate = AVAssetImageGenerator(asset: asset)
    assetImgGenerate.appliesPreferredTrackTransform = true
    let time = CMTimeMakeWithSeconds(Float64(atInterval), 100)
    do {
        let img = try assetImgGenerate.copyCGImageAtTime(time, actualTime: nil)
        let frameImg = UIImage(CGImage: img)
        return frameImg
    } catch {
        /* error handling here */
    }
    return nil
}
		Ответ 10
Вы получите изображение с миниатюр из URL-адреса, когда вы измените "fileURLWithPath" на "URLWithString".
В моем случае это сработало.
NSURL *url = [NSURL URLWithString:filepath];
AVAsset *asset = [AVAsset assetWithURL:url];
AVAssetImageGenerator *imageGenerator = [[AVAssetImageGenerator alloc]initWithAsset:asset];
CMTime time = [asset duration];
time.value = 0;
CGImageRef imageRef = [imageGenerator copyCGImageAtTime:time actualTime:NULL error:NULL];
UIImage *thumbnail = [UIImage imageWithCGImage:imageRef];
CGImageRelease(imageRef);
return thumbnail;
		Ответ 11
Swift 4
func generateThumbnail(for asset:AVAsset) -> UIImage? {
    let assetImgGenerate : AVAssetImageGenerator = AVAssetImageGenerator(asset: asset)
    assetImgGenerate.appliesPreferredTrackTransform = true
    let time = CMTimeMake(value: 1, timescale: 2)
    let img = try? assetImgGenerate.copyCGImage(at: time, actualTime: nil)
    if img != nil {
        let frameImg  = UIImage(cgImage: img!)
       return frameImg
    }
    return nil
}
 Как пользоваться:
   func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {
    picker.dismiss(animated: true) {
        switch mediaType {
        case kUTTypeMovie:
            guard info[UIImagePickerController.InfoKey.mediaType] != nil, let url = info[UIImagePickerController.InfoKey.mediaURL] as? URL else { return }
            let asset = AVAsset(url: url)
            guard let img = self.generateThumbnail(for: asset) else {
                print("Error: Thumbnail can be generated.")
                return
            }
            print("Image Size: \(img.size)")
            break
        default:
            break
        }
    }
}
		Ответ 12
Для Swift 5
import AVKit
Кодекс будет похож на ::
// Get Thumbnail Image from URL
fileprivate func getThumbnailFromUrl(_ url: String?, _ completion: @escaping ((_ image: UIImage?)->Void)) {
    guard let url = URL(string: url ?? "") else { return }
    DispatchQueue.main.async {
        let asset = AVAsset(url: url)
        let assetImgGenerate = AVAssetImageGenerator(asset: asset)
        assetImgGenerate.appliesPreferredTrackTransform = true
        let time = CMTimeMake(value: 2, timescale: 1)
        do {
            let img = try assetImgGenerate.copyCGImage(at: time, actualTime: nil)
            let thumbnail = UIImage(cgImage: img)
            completion(thumbnail)
        } catch {
            print("Error :: ", error.localizedDescription)
            completion(nil)
        }
    }
}
Использование :: Возьмите один просмотр изображения
@IBOutlet weak var imgThumbnail: UIImageView!
После этого вызовите метод для миниатюры с URL-адресом "String" в качестве параметра
self.getThumbnailFromUrl(videoURL) { [weak self] (img) in
        guard let _ = self else { return }
        if let img = img {
            self?.imgThumbnail.image = img
        }
    }
Пожалуйста, попробуйте, если он заполнен, пожалуйста, оставьте комментарий спасибо