web-dev-qa-db-ja.com

swiftでローカルビデオからサムネイルを作成

ローカルビデオファイルからSwiftでサムネイルを作成するには?

たとえば、ビデオファイルのパスが次の場所にある場合:

file:///Users/Dev/Library/Developer/CoreSimulator/Devices/F33222DF-D8F0-448B-A127-C5B03C64D0DC/data/Containers/Data/Application/4BC62DBF-0108-453C-9324-5BC0E356FE24/tmp/trim.059D11E6-F0EF-43DB-9E97-CA4F1F95D6B6.MOV

ありがとうございました。

36
Ralph

以下の編集を加えて翻訳:

AVFoundationを使用したビデオの最初のフレーム

    var err: NSError? = nil
    let asset = AVURLAsset(URL: NSURL(fileURLWithPath: "/that/long/path"), options: nil)
    let imgGenerator = AVAssetImageGenerator(asset: asset)
    let cgImage = imgGenerator.copyCGImageAtTime(CMTimeMake(0, 1), actualTime: nil, error: &err)
    // !! check the error before proceeding
    let uiImage = UIImage(CGImage: cgImage)
    let imageView = UIImageView(image: uiImage)
    // lay out this image view, or if it already exists, set its image property to uiImage
54
BaseZen

BaseZenの回答の翻訳Swift 3/Swift 4

次のように、URLアセットパスとしてサムネイルを作成する動画の場所を設定する必要があります。

import AVFoundationを忘れないでください

func generateThumbnail(path: URL) -> UIImage? {
    do {
        let asset = AVURLAsset(url: path, options: nil)
        let imgGenerator = AVAssetImageGenerator(asset: asset)
        imgGenerator.appliesPreferredTrackTransform = true
        let cgImage = try imgGenerator.copyCGImage(at: CMTimeMake(value: 0, timescale: 1), actualTime: nil)
        let thumbnail = UIImage(cgImage: cgImage)
        return thumbnail
    } catch let error {
        print("*** Error generating thumbnail: \(error.localizedDescription)")
        return nil
    }
}

これに問題があるすべての人のために、私は Github でホストされている例で次のドロップを作成しました

55
David Seek

これは、Davidの回答のクリーンアップバージョンであり、iOS 11/Swift 4.x.

使用しているSwiftのバージョンに基づいて初期時間を処理するためのさまざまな呼び出しに注意してください。

func generateThumbnail(url: URL) -> UIImage? {
    do {
        let asset = AVURLAsset(url: url)
        let imageGenerator = AVAssetImageGenerator(asset: asset)
        imageGenerator.appliesPreferredTrackTransform = true
        // Select the right one based on which version you are using
        // Swift 4.2
        let cgImage = try imageGenerator.copyCGImage(at: .zero,
                                                     actualTime: nil)
        // Swift 4.0
        let cgImage = try imageGenerator.copyCGImage(at: kCMTimeZero,
                                                     actualTime: nil)


        return UIImage(cgImage: cgImage)
    } catch {
        print(error.localizedDescription)

        return nil
    }
}
  1. 提供されたAVURLAssetからURLを作成します
  2. 新しく作成されたAVAssetImageGeneratorを使用してAVURLAssetを作成し、サムネイルを作成します
  3. appliesPreferredTrackTransform は、ジェネレーターに、マトリックスをサムネイル生成に適用するよう通知します。デフォルト値はfalseです。
  4. ビデオトラックの最初のフレームでCGImageを作成しようとします
  5. 新しく作成されたCGImageを使用してUIImageを作成し、それを返します
  6. 画像生成ステップが失敗した場合、エラーがキャッチされ、nil UIImageとともにコンソールに表示されます
19
CodeBender

BaseZenの回答は、Swift 2:

import UIKit
import AVFoundation

do {
    let asset = AVURLAsset(URL: NSURL(fileURLWithPath: "/that/long/path"), options: nil)
    let imgGenerator = AVAssetImageGenerator(asset: asset)
    imgGenerator.appliesPreferredTrackTransform = true
    let cgImage = try imgGenerator.copyCGImageAtTime(CMTimeMake(0, 1), actualTime: nil)
    let uiImage = UIImage(CGImage: cgImage)
    let imageView = UIImageView(image: uiImage)
    // lay out this image view, or if it already exists, set its image property to uiImage
} catch let error as NSError {
    print("Error generating thumbnail: \(error)")
}
12
Carl Smith

理解するために、より少ない単純なコードを記述する方が良いでしょう。これは、私がSwift(3.1 ... 4.2)

import AVFoundation

func videoPreviewUIImage(moviePath: URL) -> UIImage? {
    let asset = AVURLAsset(url: moviePath)
    let generator = AVAssetImageGenerator(asset: asset)
    generator.appliesPreferredTrackTransform = true
    let timestamp = CMTime(seconds: 2, preferredTimescale: 60)
    if let imageRef = try? generator.copyCGImage(at: timestamp, actualTime: nil) {
        return UIImage(cgImage: imageRef)
    } else {
        return nil
    }
}

それが誰かを助けることを願っています。

4
Bilal Arslan