ios - software - Fotos del marco de la imagen del video en un determinado marco.
update xcode to ios12 (3)
Creo que necesitas mirar las bibliotecas de AVFoundation para decodificar el video y tomar el marco que deseas.
Para actualizar los marcadores de posición en la biblioteca mirando los documentos, parece que necesita crear un PHAssetChangeRequest
y establecer la propiedad placeholderForCreatedAsset
en él. Luego, debe solicitar que la biblioteca realice el cambio dentro de un bloque de cambios.
Nota: Si esto es solo para su uso, puede establecer el marco del marcador de posición dentro de Fotos y eso debería reflejarse en su aplicación.
He realizado una colección de bibliotecas con videos que obtengo del marco de fotos, uso miniaturas para mostrar todos los diferentes videos usando el siguiente método
func requestImageForAsset(_ asset: PHAsset!, targetSize targetSize: CGSize, contentMode contentMode: PHImageContentMode, options options: PHImageRequestOptions!, resultHandler resultHandler: ((UIImage!, [NSObject : AnyObject]!) -> Void)!) -> PHImageRequestID
que funciona bien. Pero mis videos siempre comienzan con un marco negro, por lo que todas las miniaturas son negras. ¿Puedo desplazar el fotograma desde el que toma una imagen instantánea?
Este es el código que he usado en mi proyecto, que funciona como un encanto para mí.
func generateThumnail(url: URL) -> UIImage? {
let asset = AVAsset(url: url)
let assetImgGenerate = AVAssetImageGenerator(asset: asset)
assetImgGenerate.appliesPreferredTrackTransform = true
assetImgGenerate.maximumSize = CGSize(width: 100, height: 100)
let time = CMTimeMake(1, 30)
if let img = try? assetImgGenerate.copyCGImage(at: time, actualTime: nil) {
return UIImage(cgImage: img)
}
return nil
}
La función anterior devolverá la imagen a 1 segundo del video.
Esta es la forma de pasar el assetUrl de tu video para obtener la miniatura.
func imagePickerController(picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [NSObject : AnyObject]) {
let mediaType = info[UIImagePickerControllerMediaType] as! String
if (mediaType == kUTTypeMovie as! String){
let tempVideo = info[UIImagePickerControllerMediaURL] as! URL
if let thumbnail = self.generateThumbnail(url: tempVideo) {
// Use your thumbnail
}
Puede recuperar el objeto AVAsset
asociado con
func requestAVAssetForVideo(_ asset: PHAsset,
options options: PHVideoRequestOptions?,
resultHandler resultHandler: (AVAsset?,
AVAudioMix?,
[NSObject : AnyObject]?) -> Void) -> PHImageRequestID
luego, cargue ese activo en un AVAssetImageGenerator
que sea capaz de obtener miniaturas específicas de tiempo a través de
func copyCGImageAtTime(_ requestedTime: CMTime,
actualTime actualTime: UnsafeMutablePointer<CMTime>,
error outError: NSErrorPointer) -> CGImage!