2012-05-03 16 views
16

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

Pero: ¿Cuál es el reemplazo?

no puedo encontrar ninguna pista sobre cómo conseguir los video-dimensiones sin necesidad de utilizar «naturalsize» ...

Respuesta

20

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

naturalSize

Las dimensiones naturales de los datos de medios referenciados por la pista. (Sólo lectura)

@property (no atómica, de sólo lectura) CGSize naturalSize

disponibilidad

Disponible en iOS 4.0 y posterior. Declarado En AVAssetTrack.h

Vía: AVAssetTrack Reference for iOS

+0

'nautralSize' está en desuso en iOS 5 – Raptor

+0

acaba de comprobar los documentos en el enlace en la respuesta, y no está en desuso, está disponible en ObjC y Swift –

+14

hay 2 'naturalSize' en las documentaciones. 'AVURLAsset.naturalSize' está en desuso, pero' [[[videoAsset tracksWithMediaType: AVMediaTypeVideo] objectAtIndex: 0] naturalSize] 'no es – Raptor

24

El deprecation warning on the official documentation sugiere, "utilizan la naturalSize y preferredTransform, en su caso, del vídeo del activo seguimiento de su lugar (véase también tracksWithMediaType:)."

he cambiado de código de:

CGSize size = [movieAsset naturalSize]; 

a

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

Es bastante menos y menos seguro ahora, pero no se romperá cuando caen ese método.

13

La advertencia desaprobación dice:

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

por lo que necesitamos una AVAssetTrack, y queremos que su naturalSize y preferredTransform. Esto se puede acceder con la siguiente:

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

activo es, obviamente, su AVAsset.

+1

Hmmm aplicando la transformación como sugiere resultados en un ancho negativo para mí :( – Goz

+4

@Goz Simplemente normalice los componentes de dimensión usando 'fabsf()'. –

15

Resolución en Swift:

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)) 
} 

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

+0

Hola @Avt podría usar algunos consejos sobre la exportación de videos si no le importa. ¿Podría ayudarnos con estas preguntas, por favor? ¡Gracias por su tiempo! (1) http://stackoverflow.com/questions/34937862/merge-videos-images-in-avmutablecomposition-using-avmutablecompositiontrack (2) http: // stackoverflow. com/questions/34938904/exported-video-not-at-same-size-as-source-video – Crashalot

1

para derivar la dimensión de una AVAsset, debe calcular la unión de todas las rectas de la pista visual (después de aplicar su correspondiente transformación preferido):

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; 

métodos que se basan en CGSizeApplyAffineTransform fallar 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 juegan lado a lado con el origen de la segunda pista aumentada por el ancho de la primera pista).

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

+0

Altho David, para AVAsset que contiene un Video Track, la respuesta @Avt funciona correctamente. ¿No? –

+1

@RoiMulia: Creo que es Es poco común que los activos tengan una sola pista de video con un desplazamiento distinto de cero. Por eso, es poco probable que veas el error cuando se usa ese código. Además, he visto jugadores que ignoran el desplazamiento cuando el activo solo contiene una pista. te importa sobre handl En estos casos extremos, recomiendo experimentar usted mismo para verificar el comportamiento real. –

0

Esta es una extensión bastante simple para AVAsset en Swift 4 para obtener el tamaño del vídeo, 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 
    } 
} 
+0

Gracias - la aplicación está escrita en Objective-C, aunque (aún tengo que volver a escribirla). Lo verificaré si puedo adaptar tu extensión ... – Swissdude

Cuestiones relacionadas