Pregunta NSURL de PHAsset


Estoy convirtiendo nuestra aplicación para usar Photos Framework de iOS8, el framework ALAsset es claramente un ciudadano de segunda clase bajo iOS8.

Estoy teniendo un problema es que nuestra arquitectura realmente quiere un NSURL que represente la ubicación de los medios en "disco". Usamos esto para cargar los medios a nuestros servidores para su posterior procesamiento.

Esto fue fácil con ALAsset:

    ALAssetRepresentation *rep = [asset defaultRepresentation];
    self.originalVideo = rep.url;

Pero no estoy viendo esta habilidad en PHAsset. Creo que puedo llamar:

    imageManager.requestImageDataForAsset

y luego escribirlo en un punto temporal en el sistema de archivos, pero parece terriblemente pesado y derrochador, por no hablar de potencialmente lento.

¿Hay alguna forma de obtener esto o tendré que refacturar más mi aplicación para que solo use NSURL para iOS7 y algún otro método para iOS8?


37
2017-09-24 20:01


origen


Respuestas:


Si utiliza [imageManager  requestAVAssetForVideo...], devolverá un AVAsset. Ese AVAsset es en realidad un AVURLAsset, entonces si lo lanzas, puedes acceder a él -url propiedad.

No estoy seguro si puede crear un nuevo activo a partir de esto, pero sí le da la ubicación.


23
2017-10-01 14:43



Versión SWIFT 2.0 Esta función devuelve NSURL del PHAsset (tanto de imagen como de video)

func getAssetUrl(mPhasset : PHAsset, completionHandler : ((responseURL : NSURL?) -> Void)){

    if mPhasset.mediaType == .Image {
        let options: PHContentEditingInputRequestOptions = PHContentEditingInputRequestOptions()
        options.canHandleAdjustmentData = {(adjustmeta: PHAdjustmentData) -> Bool in
            return true
        }
        mPhasset.requestContentEditingInputWithOptions(options, completionHandler: {(contentEditingInput: PHContentEditingInput?, info: [NSObject : AnyObject]) -> Void in
            completionHandler(responseURL : contentEditingInput!.fullSizeImageURL)
        })
    } else if mPhasset.mediaType == .Video {
        let options: PHVideoRequestOptions = PHVideoRequestOptions()
        options.version = .Original
        PHImageManager.defaultManager().requestAVAssetForVideo(mPhasset, options: options, resultHandler: {(asset: AVAsset?, audioMix: AVAudioMix?, info: [NSObject : AnyObject]?) -> Void in

            if let urlAsset = asset as? AVURLAsset {
                let localVideoUrl : NSURL = urlAsset.URL
                completionHandler(responseURL : localVideoUrl)
            } else {
                completionHandler(responseURL : nil)
            }
        })
    }

}

17
2018-01-30 09:00



Si tiene un PHAsset, puede obtener la URL de dicho activo de la siguiente manera:

[asset requestContentEditingInputWithOptions:editOptions
                           completionHandler:^(PHContentEditingInput *contentEditingInput, NSDictionary *info) {
    NSURL *imageURL = contentEditingInput.fullSizeImageURL;
}];

9
2018-03-05 17:33



Usa el nuevo localIdentifier propiedad de PHObject. (PHAs hereda de esto).

Proporciona una funcionalidad similar a una URL ALAsset, es decir, que puede cargar activos llamando al método

+[PHAsset fetchAssetsWithLocalIdentifiers:identifiers options:options]

8
2018-04-29 04:19



Todas las soluciones anteriores no funcionarán para videos de cámara lenta. Una solución que encontré maneja todos los tipos de activos de video es esta:

func createFileURLFromVideoPHAsset(asset: PHAsset, destinationURL: NSURL) {
    PHCachingImageManager().requestAVAssetForVideo(self, options: nil) { avAsset, _, _ in
        let exportSession = AVAssetExportSession(asset: avAsset!, presetName: AVAssetExportPresetHighestQuality)!
        exportSession.outputFileType = AVFileTypeMPEG4
        exportSession.outputURL = destinationURL

        exportSession.exportAsynchronouslyWithCompletionHandler {
            guard exportSession.error == nil else {
                log.error("Error exporting video asset: \(exportSession.error)")
                return
            }

            // It worked! You can find your file at: destinationURL
        }
    }
}

5
2017-08-17 10:06



Ver esta respuesta aquí.

Y éste aquí.

Según mi experiencia, primero deberá exportar el activo a un disco para obtener una URL confiable y totalmente accesible.

Las respuestas vinculadas a arriba describen cómo hacer esto.


3
2018-03-16 19:50



En speking de url de PHAsset, Una vez había preparado una función de utilidad Swift 2 (aunque solo para reproducir videos de PHAsset) Compartirlo en esta respuesta, podría ayudar a alguien.

static func playVideo (view:UIViewController, asset:PHAsset)

Por favor, chequee esto Responder


1
2017-09-20 21:34