AVURLAsset获取视频大小

时间:2012-05-03 14:46:08

标签: xcode ios5 avurlasset

这非常令人沮丧。我试图获得AVURLasset的大小,但是试图避免{X}告诉我的naturalSize,这在iOS5中已被弃用。

但是:什么是替代品?

我无法找到任何关于如何在不使用«naturalsize»的情况下获取视频尺寸的线索......

7 个答案:

答案 0 :(得分:29)

我刚刚在线检查了文档,并且对于AVAsset对象不推荐使用naturalSize方法。但是,应始终存在引用AVAsset的AVAssetTrack,并且AVAssetTrack具有可以调用的naturalSize方法。

  

naturalSize

     

轨道引用的媒体数据的自然尺寸。 (只读)

     

@property(nonatomic,readonly)CGSize naturalSize

     

<强>状况

     

适用于iOS 4.0及更高版本。在AVAssetTrack.h中声明

通过:AVAssetTrack Reference for iOS

答案 1 :(得分:26)

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的解决方案不会为最新设备上的某些视频返回正确的值!

答案 2 :(得分:25)

deprecation warning on the official documentation建议,“酌情使用资产视频片段的naturalSizepreferredTransform(另请参阅tracksWithMediaType:)。”

我改变了我的代码:

CGSize size = [movieAsset naturalSize];

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

现在它不那么美观,也不那么安全,但是当它们放弃那种方法时就不会破坏。

答案 3 :(得分:16)

弃用警告说:

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

答案 4 :(得分:2)

要派生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;

当您的资源包含具有非平凡仿射变换(例如,45度旋转)的曲目或者您的资源包含具有不同来源的曲目时(例如,两个曲目旁边播放),依赖CGSizeApplyAffineTransform的方法会失败第二个音轨的原点增加了第一个音轨的宽度。

请参阅https://opensource.apple.com/source/WebCore/WebCore-7536.30.2/platform/graphics/avfoundation/cf/MediaPlayerPrivateAVFoundationCF.cpp

上的MediaPlayerPrivateAVFoundationCF::sizeChanged()

答案 5 :(得分:2)

这是 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
    }
}

答案 6 :(得分:2)

对于Swift 5

  let assetSize =  asset.tracks(withMediaType: .video)[0].naturalSize