sobre reggaeton park para minutos mejor eleanor cosas cantando canciones cancion acustico xcode ios5 avurlasset

xcode - park - reggaeton en acustico



AVURLAsset consiguiendo tamaƱo de video (6)

Esto es bastante frustrante. Estoy tratando de obtener el tamaño de un AVURLasset, pero trato de evitar el naturalSize ya que Xcode me dice que esto está en desuso en iOS5.

Pero: ¿Cuál es el reemplazo?

No puedo encontrar ninguna pista sobre cómo obtener las dimensiones del video sin utilizar «naturalsize» ...


Acabo de verificar la documentación en línea y el método naturalSize está en desuso para el objeto AVAsset. Sin embargo, siempre debería haber un AVAssetTrack que se refiera al AVAsset, y el AVAssetTrack tiene un método naturalSize que puede llamar.

tamaño natural

Las dimensiones naturales de los datos multimedia a los que hace referencia la pista. (solo lectura)

@propiedad (no atómica, solo lectura) CGSize naturalSize

Disponibilidad

Disponible en iOS 4.0 y versiones posteriores. Declarado en AVAssetTrack.h

Via: AVAssetTrack Reference para iOS


Esta es una extensión bastante simple para AVAsset en Swift 4 para obtener el tamaño del video, si está disponible:

extension AVAsset { var screenSize: CGSize? { if let track = tracks(withMediaType: .video).first { let size = __CGSizeApplyAffineTransform(track.naturalSize, track.preferredTransform) return CGSize(width: fabs(size.width), height: fabs(size.height)) } return nil } }


La advertencia de desaprobación en la documentación oficial sugiere: "En su lugar, use el naturalSize y preferredTransform , según corresponda, de las pistas de video del activo (consulte también tracksWithMediaType: ".

Cambié mi código de:

CGSize size = [movieAsset naturalSize];

a

CGSize size = [[[movieAsset tracksWithMediaType:AVMediaTypeVideo] objectAtIndex:0] naturalSize];

Ahora es menos bonito y menos seguro, pero no se romperá cuando dejen de usar ese método.


La advertencia de desprecio dice:

Use the naturalSize and preferredTransform, as appropriate, of the asset’s video tracks instead (see also tracksWithMediaType:).

Por lo tanto, necesitamos un AVAssetTrack , y queremos que sea naturalSize y preferredTransform . Esto se puede acceder con lo siguiente:

AVAssetTrack *track = [[asset tracksWithMediaType:AVMediaTypeVideo] firstObject]; CGSize dimensions = CGSizeApplyAffineTransform(track.naturalSize, track.preferredTransform);

El activo es obviamente su AVAsset .


Para derivar la dimensión de un AVAsset , debe calcular la unión de todos los rects de pistas visuales (después de aplicar su correspondiente transformación preferida):

CGRect unionRect = CGRectZero; for (AVAssetTrack *track in [asset tracksWithMediaCharacteristic:AVMediaCharacteristicVisual]) { CGRect trackRect = CGRectApplyAffineTransform(CGRectMake(0.f, 0.f, track.naturalSize.width, track.naturalSize.height), track.preferredTransform); unionRect = CGRectUnion(unionRect, trackRect); } CGSize naturalSize = unionRect.size;

Los métodos que se basan en CGSizeApplyAffineTransform fallan cuando su activo contiene pistas con transformación afín no trivial (por ejemplo, rotaciones de 45 grados) o si su activo contiene pistas con orígenes diferentes (por ejemplo, dos pistas que se reproducen en paralelo con el origen de la segunda pista aumentada por el ancho de la primera pista).

Consulte: MediaPlayerPrivateAVFoundationCF::sizeChanged() en https://opensource.apple.com/source/WebCore/WebCore-7536.30.2/platform/graphics/avfoundation/cf/MediaPlayerPrivateAVFoundationCF.cpp


Resolución en Swift 3:

func resolutionSizeForLocalVideo(url:NSURL) -> CGSize? { guard let track = AVAsset(URL: url).tracksWithMediaType(AVMediaTypeVideo).first else { return nil } let size = CGSizeApplyAffineTransform(track.naturalSize, track.preferredTransform) return CGSize(width: fabs(size.width), height: fabs(size.height)) }

Para Swift 4:

func resolutionSizeForLocalVideo(url:NSURL) -> CGSize? { guard let track = AVAsset(url: url as URL).tracks(withMediaType: AVMediaType.video).first else { return nil } let size = track.naturalSize.applying(track.preferredTransform) return CGSize(width: fabs(size.width), height: fabs(size.height)) }

¡Las soluciones sin preferredTransform no devuelven los valores correctos para algunos videos en los últimos dispositivos!