2012-05-03 12 views
16

Questo è piuttosto frustrante. Sto cercando di ottenere le dimensioni di un AVURLasset, ma cerco di evitare naturalSize poiché Xcode mi dice, questo è deprecato in iOS5.AVURLAsveglia la dimensione del video

Ma: Qual è la sostituzione?

Non riesco a trovare alcun indizio su come ottenere il video-dimensioni senza l'utilizzo di «naturalsize» ...

risposta

20

Ho appena controllato la documentazione in linea, e il metodo naturalSize è deprecato per l'oggetto AVAsset. Tuttavia, dovrebbe esserci sempre un AVAssetTrack che si riferisce a AVAsset e AVAssetTrack ha un metodo naturalSize che è possibile chiamare.

naturalSize

Le dimensioni fisiche dei dati multimediali riferimento la pista. (Sola lettura)

@property (nonatomic, sola lettura) CGSize naturalSize

disponibilità

Disponibile in iOS 4.0 e versioni successive. Dichiarato In AVAssetTrack.h

Via: AVAssetTrack Reference for iOS

+0

'nautralSize' è deprecato in iOS 5 – Raptor

+0

ha appena controllato i documenti nel link nella risposta, e non è deprecato, è disponibile sia in ObjC che in Swift –

+14

ci sono 2 'naturalSize' nelle documentazioni. 'AVURLAsset.naturalSize' è deprecato, ma' [[[videoAsset tracksWithMediaType: AVMediaTypeVideo] objectAtIndex: 0] naturalSize] 'non è – Raptor

24

Il deprecation warning on the official documentation suggerisce, "Usa il naturalSize e preferredTransform, a seconda dei casi, video del bene traccia (si veda anche tracksWithMediaType:)."

ho cambiato il mio codice:

CGSize size = [movieAsset naturalSize]; 

a

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

E 'meno bella e meno sicuro, ma ora non si rompe quando cadono quel metodo.

13

L'avvertimento deprecazione dice:

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

Quindi abbiamo bisogno di un AVAssetTrack, e vogliamo che la sua naturalSize e preferredTransform. Questo può essere raggiunto con il seguente:

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

patrimoniale è, ovviamente, il vostro AVAsset.

+1

Hmmm applica la trasformazione come suggerisci risultati per una larghezza negativa per me :( – Goz

+4

@Goz Basta normalizzare i componenti della dimensione usando 'fabsf()'. –

15

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

Soluzioni senza preferredTransform non restituiscono i valori corretti per alcuni video sugli ultimi dispositivi!

+0

Ciao @Avt potresti usare qualche consiglio sull'esportazione di video se non ti dispiace. Potete aiutarci su queste domande per favore? Grazie per il vostro tempo! (1) http://stackoverflow.com/questions/34937862/merge-videos-images-in-avmutablecomposition-using-avmutablecompositiontrack (2) http: // stackoverflow. it/questions/34938904/exported-video-not-at-same-size-as-source-video – Crashalot

1

per ricavare la dimensione di una AVAsset, si dovrebbe calcolare l'unione di tutti i rettangoli traccia visiva (dopo aver applicato la loro trasformazione preferito corrispondente):

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; 

I metodi che si basano su CGSizeApplyAffineTransform fallire quando la risorsa contiene tracce con trasformazioni affini non banali (ad es., rotazioni di 45 gradi) o se la tua risorsa contiene tracce con origini diverse (ad esempio, due tracce che giocano fianco a fianco con l'origine della seconda traccia aumentata dalla larghezza della prima traccia).

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

+0

Altho David, per AVAsset che contiene una traccia video, la risposta @Avt funziona correttamente. Giusto? –

+1

@RoiMulia: Penso che sia non comune per le risorse avere una singola traccia video con un offset diverso da zero, per cui è improbabile che si veda il bug quando si utilizza quel codice. Inoltre, ho visto giocatori che ignorano l'offset quando la risorsa contiene solo una traccia. ti interessa a riguardo In questi casi limite, ti consiglio di sperimentare te stesso per verificare il comportamento effettivo. –

0

Questo è un abbastanza semplice estensione per AVAsset in Swift 4 per ottenere la dimensione del video, se disponibile:

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

Grazie - l'app è scritta in Objective-C, sebbene (devo ancora riscriverlo). Verificherò se posso adattare la tua estensione ... – Swissdude

Problemi correlati