Cómo crear miniaturas en swift de un archivo de vídeo local ?

Por ejemplo si el archivo de vídeo de la ruta se encuentra aquí :

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

Gracias.

InformationsquelleAutor Ralph | 2015-08-03

6 Comentarios

  1. 54

    Traducido con algunas de las ediciones de:

    Primer fotograma de un vídeo con 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
    • Gracias. Funciona!
    • Gran trabajo…!!
    • ¿Cómo puedo obtener Miniatura de duración (10 segundos a 15 segundos) el uso de cualquier URL del video?
    • Voy a tomar una conjetura y decir que te ofrezcan un CMTime?
    • cómo conseguir un sistema de cameraRoll miniatura de vídeo?
  2. 55

    BaseZen la respuesta traducido Swift 3 /Swift 4

    Que usted necesita para establecer la ubicación del vídeo que desea hacer una miniatura de la dirección url de activos ruta de acceso, como:

    No olvides 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
        }
    }

    Para que todo el mundo tiene problemas con esto he creado la siguiente gota en el ejemplo alojado en Github

    • Esto me ayudó mucho, gracias por la conversión de
    • seguro. eres muy bienvenido amigo
    • Hey, gracias por el código, no sé por qué, pero su toma 10-15 segundos para mostrar la vista preliminar. Puede alguien por favor ayuda?
    • abrir un nuevo hilo y proporcionar su código y la lógica
    • Bueno…Gracias…
    • han creado un nuevo hilo, la mente y echar un vistazo? stackoverflow.com/questions/41407123/…
    • desde ya tienes una respuesta, acabo de upvoted para usted así que usted es el break even de nuevo
    • Muy bueno. Lo siento por la pregunta de noob, pero, ¿qué tipo de formato de vídeo son compatibles?
    • Error al generar la miniatura: No se puede Abrir en iOS 11. De uso adicionales descripción que ya está allí.
    • He creado el siguiente proyecto GIT para usted: github.com/davidseek/ThumbnailTestProject check it out
    • Gracias por el código 🙂
    • ¿Cómo puedo obtener Miniatura de duración (10 segundos a 15 segundos) el uso de cualquier URL del video?
    • No con este enfoque. Que usted necesita para crear una función para obtener una sub-vídeo para la duración que desee y, a continuación, obtener una vista en miniatura de la sub vídeo.

  3. 19

    Este es un limpiado de la versión de David, la respuesta de prueba en contra de iOS 11 /Swift 4.x.

    Tenga en cuenta las diferentes convocatorias para el manejo del tiempo inicial basado en la versión de Swift está utilizando.

    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. Crea una AVURLAsset de la URL
    2. Crea una AVAssetImageGenerator el uso de la recién creada AVURLAsset, es el responsable de hacer la miniatura
    3. appliesPreferredTrackTransform informa que el generador de aplicar la matriz para la generación de imágenes en miniatura. El valor predeterminado es false.
    4. Intenta crear un CGImage en el primer cuadro de la pista de vídeo
    5. Crea un UIImage el uso de la recién creada CGImage & devuelve
    6. Si la generación de la imagen se produce un error, un error es capturado y presentado a la consola junto con un nil UIImage
    • Se está trabajando en swift 4.
  4. 12

    BaseZen la respuesta traducido a 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)")
    }
    • seguro, y var err es irrelevante ahora.
    • Gracias. Me lo quitaron.
    • He encontrado que algunos de mis miniaturas no tienen la misma orientación que los vídeos originales. Configuración de imgGenerator.appliesPreferredTrackTransform a la verdadera fija que.
    • ¿Cómo puedo obtener Miniatura de duración (10 segundos a 15 segundos) el uso de cualquier URL del video?
  5. 4

    Es mejor escribir menos y de código sencillo para la comprensión.
    Esto es lo que tengo que convertir las soluciones en 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
        }
    }

    Espero que ayude a alguien.

  6. -1
    func saveImageDocumentDirectoryWithDate(tempImage:UIImage, block : @escaping (_ url: URL?) -> Void ){
    
        let documentsDirectoryURL = try! FileManager().url(for: .documentDirectory, in: .userDomainMask, appropriateFor: nil, create: true)
    
        let random : String =  randomString(length: 5)
    
        let fileURL = documentsDirectoryURL.appendingPathComponent(String(format:"CPImage%@.png",random))
        do { try tempImage.pngData()?.write(to: fileURL) }
        catch { block(nil) }
        block(fileURL)}

Dejar respuesta

Please enter your comment!
Please enter your name here