AVURLAsset获取视频大小

Swi*_*ude 23 xcode avurlasset ios5

这非常令人沮丧.我正在尝试获取AVURLasset的大小,但是尽管naturalSizeXcode告诉我,这是在iOS5中不推荐使用的.

但是:什么是替代品?

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

C4 *_*vis 30

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

naturalSize

轨道引用的媒体数据的自然维度.(只读)

@property(nonatomic,readonly)CGSize naturalSize

可用性

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

通过:iOS的AVAssetTrack参考

  • 文档中有2个`naturalSize`.不推荐使用`AVURLAsset.naturalSize`,但`[[[videoAsset tracksWithMediaType:AVMediaTypeVideo] objectAtIndex:0] naturalSize]`不是 (14认同)

Avt*_*Avt 29

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))
}
Run Code Online (Sandbox Code Playgroud)

对于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))
}
Run Code Online (Sandbox Code Playgroud)

解决方案没有preferredTransform为最新设备上的某些视频返回正确的值!


Dav*_*urt 25

官方文档中弃用警告表明,"使用naturalSizepreferredTransform,视情况而定,使用资产的视频轨道(另见tracksWithMediaType:)."

我改变了我的代码:

CGSize size = [movieAsset naturalSize];
Run Code Online (Sandbox Code Playgroud)

CGSize size = [[[movieAsset tracksWithMediaType:AVMediaTypeVideo] objectAtIndex:0] naturalSize];
Run Code Online (Sandbox Code Playgroud)

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


dlo*_*omb 16

弃用警告说:

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

因此,我们需要一个AVAssetTrack,我们希望它naturalSizepreferredTransform.可以使用以下方法访问:

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

资产显然是你的AVAsset.

  • @Goz使用`fabsf()`标准化维度组件. (5认同)
  • 嗯应用你建议的变换导致我的负宽度:( (2认同)

Cod*_*der 5

这是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
    }
}
Run Code Online (Sandbox Code Playgroud)