これはかなりイライラします。AVURLassetのサイズを取得しようとしていますがnaturalSize
、Xcodeが教えてくれるので避けてください。これは、iOS5では非推奨です。
しかし:代替品は何ですか?
«naturalsize»を使用せずにビデオのサイズを取得する方法についての手がかりを見つけることができません...
これはかなりイライラします。AVURLassetのサイズを取得しようとしていますがnaturalSize
、Xcodeが教えてくれるので避けてください。これは、iOS5では非推奨です。
しかし:代替品は何ですか?
«naturalsize»を使用せずにビデオのサイズを取得する方法についての手がかりを見つけることができません...
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))
}
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))
}
のないソリューションpreferredTransform
は、最新のデバイスの一部のビデオに対して正しい値を返しません!
オンラインでドキュメントを確認したところnaturalSize
、AVAssetオブジェクトのメソッドは非推奨になりました。ただし、AVAssetを参照するAVAssetTrackが常に存在する必要があり、AVAssetTrackにはnaturalSize
呼び出すことができるメソッドがあります。
naturalSize
トラックによって参照されるメディアデータの自然な寸法。(読み取り専用)
@property(nonatomic、readonly)CGSize naturalSize
可用性
iOS4.0以降で利用できます。AVAssetTrack.hで宣言
公式ドキュメントの非推奨の警告は、「代わりに、アセットのビデオトラックのとを必要に応じてnaturalSize
使用する」ことを示唆しています(も参照してください)。preferredTransform
tracksWithMediaType:
コードを次のように変更しました:
CGSize size = [movieAsset naturalSize];
に
CGSize size = [[[movieAsset tracksWithMediaType:AVMediaTypeVideo] objectAtIndex:0] naturalSize];
今ではあまりきれいではなく、安全性も低くなっていますが、そのメソッドを削除しても壊れることはありません。
非推奨の警告は次のように述べています。
Use the naturalSize and preferredTransform, as appropriate,
of the asset’s video tracks instead (see also tracksWithMediaType:).
したがって、AVAssetTrackが必要であり、そのnaturalSizeとpreferredTransformが必要です。これには、次の方法でアクセスできます。
AVAssetTrack *track = [[asset tracksWithMediaType:AVMediaTypeVideo] firstObject];
CGSize dimensions = CGSizeApplyAffineTransform(track.naturalSize, track.preferredTransform);
アセットは明らかにあなたのAVAssetです。
AVAsset
これは、Swift 4で、可能な場合はビデオのサイズを取得するための非常に単純な拡張機能です。
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
}
}
の次元を導出するには、AVAsset
(対応する優先変換を適用した後)すべてのビジュアルトラック長方形の和集合を計算する必要があります。
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;
CGSizeApplyAffineTransform
アセットに重要なアフィン変換(たとえば、45度の回転)のトラックが含まれている場合、またはアセットに異なる原点のトラックが含まれている場合(たとえば、2つのトラックが2番目のトラックの原点と並んで再生されている場合)、依存するメソッドは失敗します。最初のトラックの幅)。
参照:httpsMediaPlayerPrivateAVFoundationCF::sizeChanged()
: //opensource.apple.com/source/WebCore/WebCore-7536.30.2/platform/graphics/avfoundation/cf/MediaPlayerPrivateAVFoundationCF.cpp
Swift5の場合
let assetSize = asset.tracks(withMediaType: .video)[0].naturalSize