web-dev-qa-db-ja.com

AVURLAssetが動画サイズを取得

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

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

"naturalsize"を使用せずにビデオの寸法を取得する方法についての手がかりはありません...

23
Swissdude

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

naturalSize

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

@property(非アトミック、読み取り専用)CGSize naturalSize

在庫状況

IOS 4.0以降で利用できます。 AVAssetTrack.hで宣言

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

30
C4 - Travis

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のないソリューションは、最新のデバイスの一部のビデオに対して正しい値を返さない!

29
Avt

公式ドキュメントの非推奨警告 は、「代わりに、アセットのビデオトラックのnaturalSizeおよびpreferredTransformを適切に使用する( tracksWithMediaType: )。」

私は自分のコードを次のように変更しました:

CGSize size = [movieAsset naturalSize];

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

今はあまり美しくなく安全ではありませんが、そのメソッドをドロップしても壊れません。

25
Dave Burt

非推奨の警告は言う:

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です。

16
dloomb

これはSwift 4AVAssetのかなり単純な拡張で、ビデオのサイズを取得します(可能な場合)。

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
    }
}
3
CodeBender

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

2
David H