これはかなりイライラします。 AVURLassetのサイズを取得しようとしていますが、naturalSize
を回避するようにしてください。Xcodeが通知するので、これはiOS5では非推奨です。
しかし:代替品は何ですか?
"naturalsize"を使用せずにビデオの寸法を取得する方法についての手がかりはありません...
オンラインでドキュメントを確認したところ、naturalSize
メソッドはAVAssetオブジェクトで非推奨になりました。ただし、AVAssetを参照するAVAssetTrackは常に存在する必要があり、AVAssetTrackにはnaturalSize
メソッドを呼び出すことができます。
naturalSize
トラックによって参照されるメディアデータの自然なサイズ。 (読み取り専用)
@property(非アトミック、読み取り専用)CGSize naturalSize
在庫状況
IOS 4.0以降で利用できます。 AVAssetTrack.hで宣言
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
および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);
assetは明らかにあなたのAVAssetです。
これはSwift 4のAVAsset
のかなり単純な拡張で、ビデオのサイズを取得します(可能な場合)。
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番目のトラックの原点は、最初のトラックの幅で拡張されます)。
参照:MediaPlayerPrivateAVFoundationCF::sizeChanged()
at https://opensource.Apple.com/source/WebCore/WebCore-7536.30.2/platform/graphics/avfoundation/cf/MediaPlayerPrivateAVFoundationCF.cpp