29

これはかなりイライラします。AVURLassetのサイズを取得しようとしていますがnaturalSize、Xcodeが教えてくれるので避けてください。これは、iOS5では非推奨です。

しかし:代替品は何ですか?

«naturalsize»を使用せずにビデオのサイズを取得する方法についての手がかりを見つけることができません...

4

7 に答える 7

46

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は、最新のデバイスの一部のビデオに対して正しい値を返しません!

于 2015-12-18T22:36:00.640 に答える
34

オンラインでドキュメントを確認したところnaturalSize、AVAssetオブジェクトのメソッドは非推奨になりました。ただし、AVAssetを参照するAVAssetTrackが常に存在する必要があり、AVAssetTrackにはnaturalSize呼び出すことができるメソッドがあります。

naturalSize

トラックによって参照されるメディアデータの自然な寸法。(読み取り専用)

@property(nonatomic、readonly)CGSize naturalSize

可用性

iOS4.0以降で利用できます。AVAssetTrack.hで宣言

経由:iOS用AVAssetTrackリファレンス

于 2012-05-03T16:17:37.403 に答える
26

公式ドキュメントの非推奨の警告は、「代わりに、アセットのビデオトラックのとを必要に応じてnaturalSize使用する」ことを示唆しています(も参照してください)。preferredTransformtracksWithMediaType:

コードを次のように変更しました:

CGSize size = [movieAsset naturalSize];

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

今ではあまりきれいではなく、安全性も低くなっていますが、そのメソッドを削除しても壊れることはありません。

于 2013-08-20T00:16:00.953 に答える
17

非推奨の警告は次のように述べています。

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

したがって、AVAssetTrackが必要であり、そのnaturalSizepreferredTransformが必要です。これには、次の方法でアクセスできます。

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

アセットは明らかにあなたのAVAssetです。

于 2015-01-07T19:55:41.197 に答える
4

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
    }
}
于 2018-01-20T21:45:30.420 に答える
3

の次元を導出するには、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

于 2017-03-10T01:21:41.953 に答える
2

Swift5の場合

  let assetSize =  asset.tracks(withMediaType: .video)[0].naturalSize
于 2020-08-17T12:39:31.057 に答える