Xcode AVURLSET获取视频大小

Xcode AVURLSET获取视频大小,xcode,ios5,avurlasset,Xcode,Ios5,Avurlasset,这相当令人沮丧。我试图获得avurlaste的大小,但尽量避免naturalSize,因为Xcode告诉我,这在iOS5中是不推荐的 但是:替代品是什么 我找不到任何关于如何在不使用«naturalsize»的情况下获取视频维度的线索…我只是在线查看了文档,并且对于AVAsset对象,naturalsize方法已被弃用。但是,应该始终有一个AVAssetTrack引用AVAsset,并且AVAssetTrack有一个naturalSize方法可以调用 自然化 曲目引用的媒体数据的自然尺寸。(只读

这相当令人沮丧。我试图获得avurlaste的大小,但尽量避免
naturalSize
,因为Xcode告诉我,这在iOS5中是不推荐的

但是:替代品是什么


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

我只是在线查看了文档,并且对于AVAsset对象,
naturalsize
方法已被弃用。但是,应该始终有一个AVAssetTrack引用AVAsset,并且AVAssetTrack有一个
naturalSize
方法可以调用

自然化

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

@属性(非原子,只读)CGSize naturalSize

可用性

在iOS 4.0及更高版本中提供。在AVAssetTrack.h中声明

Via:

建议,“使用资产视频曲目的
自然化
首选转换(视情况而定)。”

我将代码更改为:

CGSize size = [movieAsset naturalSize];


现在它不那么漂亮,也不那么安全,但当他们放弃该方法时,它不会崩溃。

弃用警告说:

Use the naturalSize and preferredTransform, as appropriate, 
of the asset’s video tracks instead (see also tracksWithMediaType:).
因此,我们需要一个AVAssetTrack,并且我们希望它的自然化首选转换。可通过以下方式访问此功能:

AVAssetTrack *track = [[asset tracksWithMediaType:AVMediaTypeVideo] firstObject];
CGSize dimensions = CGSizeApplyAffineTransform(track.naturalSize, track.preferredTransform);
资产显然是您在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
的解决方案不会返回正确的值

若要导出
AVAsset
的维度,应计算所有可视轨迹矩形的并集(在应用其相应的首选变换后):

CGRect unionRect=CGRectZero;
对于(在[资产跟踪中间特性:AVMediaCharacteristicVisual]中的AVAssetTrack*跟踪){
CGRect trackRect=CGRectApplyAffineTransform(CGRectMake(0.f,
0.f,
track.naturalSize.width,
轨道、自然化、高度),
track.preferredTransform);
unionRect=CGRectUnion(unionRect,trackRect);
}
CGSize naturalSize=unionRect.size;
如果资源包含具有非平凡仿射变换(例如,45度旋转)的轨迹,或者如果资源包含具有不同原点的轨迹(例如,两个轨迹并排播放,第二个轨迹的原点增加了第一个轨迹的宽度),则依赖于
cgsizeApplyAffinetTransform的方法将失败


请参阅:
MediaPlayerPrivateAVFoundationCF::sizeChanged()
at

这是一个相当简单的扩展,用于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
    }
}
斯威夫特5号

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

nautralSize
在iOS 5中已被弃用,只需在回答中的链接中检查文档,它没有弃用,它在ObjC和SWIFT中都可用文档中有2个
naturalSize
AVURLAsset.naturalSize
已被弃用,但
[[videoAsset tracksWithMediaType:AVMediaTypeVideo]objectAtIndex:0]naturalSize]
不是我的答案指定了
AVAssetTrack
方法,该方法未被弃用,这是Dave在下面第二行代码中指定的方法。。。看起来我只是没有在我的答案中添加代码行。所以每个人都开始做与不推荐的方法基本相同的事情。很好。Hmmm按照您的建议应用变换会导致我的宽度为负:(@Goz只是使用
fabsf()使维度组件正常化)
。Altho David,对于包含一个视频曲目的AVAsset,@Avt answer可以正常工作。对吗?@RoiMulia:我认为资产拥有一个非零偏移量的视频曲目是很少见的。因此,在使用该代码时,您可能不太可能看到错误。此外,我也见过一些播放器在资产仅包含一个曲目时忽略偏移量。如果如果您关心如何处理这些边缘案例,我建议您自己进行实验以验证实际行为。谢谢-该应用程序是用Objective-C编写的(我还没有重写它).我将检查是否可以调整您的扩展…嗨,我面临相同的问题。您找到解决方案了吗?因为在我的情况下,使用自然大小+首选转换返回一个过时的值:(谢谢
  let assetSize =  asset.tracks(withMediaType: .video)[0].naturalSize