Как реализовать AVAssetImageGenerator.copyCGImageAtTime в swift

до сих пор у меня есть следующее

  let assetUrl = NSURL.URLWithString(self.targetVideoString)
  let asset: AVAsset = AVAsset.assetWithURL(assetUrl) as AVAsset
  let imageGenerator = AVAssetImageGenerator(asset: asset);
  let time : CMTime = CMTimeMakeWithSeconds(1.0, 1)
  let actualTime : CMTime
  let myImage: CGImage =imageGenerator.copyCGImageAtTime(requestedTime: time, actualTime:actualTime, error: <#NSErrorPointer#>)

в последней строке я теряюсь ... Я просто хочу захватить изображение в момент 1.0 секунд

4 ответов


функция объявляется как

func copyCGImageAtTime(requestedTime: CMTime, actualTime: UnsafeMutablePointer<CMTime>, error outError: NSErrorPointer) -> CGImage!

и вы должны пройти (инициализирован) CMTime и NSError? переменные как "выражение in-out" с &:

let assetUrl = NSURL(string: ...)
let asset: AVAsset = AVAsset.assetWithURL(assetUrl) as AVAsset
let imageGenerator = AVAssetImageGenerator(asset: asset);
let time = CMTimeMakeWithSeconds(1.0, 1)

var actualTime : CMTime = CMTimeMake(0, 0)
var error : NSError?
let myImage = imageGenerator.copyCGImageAtTime(time, actualTime: &actualTime, error: &error)

обратите внимание также, что ваша первая строка

let assetUrl = NSURL.URLWithString(self.targetVideoString)

больше не компилируется с текущим Xcode 6.1.


С Swift2.0 imageGenerator.copyCGImageAtTime теперь отмечен бросками, поэтому вам нужно обрабатывать ошибки в блоке do - try - catch.

    let asset : AVAsset = AVAsset(URL: yourNSURLtoTheAsset )
    let imageGenerator = AVAssetImageGenerator(asset: asset)
    let time = CMTimeMakeWithSeconds(0.5, 1000)
    var actualTime = kCMTimeZero
    var thumbnail : CGImageRef?
    do {
        thumbnail = try imageGenerator.copyCGImageAtTime(time, actualTime: &actualTime)
    }
    catch let error as NSError {
        print(error.localizedDescription)
    }

по крайней мере, Xcode 7.0.1 и Swift 2 assetwithURL сейчас: let asset = AVAsset(URL: assetURL). Ошибка Xcode была "'assetWithURL' недоступна: используйте конструкцию объекта ' AVAsset (URL:)'"


принятый ответ в Swift 3, 4:

let asset = AVURLAsset(url: URL(fileURLWithPath: "YOUR_URL_STRING_HERE"))
let imgGenerator = AVAssetImageGenerator(asset: asset)
var cgImage: CGImage?
do {
    cgImage = try imgGenerator.copyCGImage(at: CMTimeMake(0, 1), actualTime: nil)
} catch let error as NSError {
    // Handle the error
    print(error)
}
// Handle the nil that cgImage might be
let uiImage = UIImage(cgImage: cgImage!)