AVURLAsset获得视频大小(AVURLAsset getting video size)

2019-06-24 03:36发布

这是非常令人沮丧的。 我试图让一个AVURLasset的大小,但尽量避免naturalSize因为Xcode中告诉我,这是在iOS5中弃用。

但是:有什么替代?

我无法找到如何让视频尺寸,而不使用«naturalsize»任何线索......

Answer 1:

我只是检查了在线文档和naturalSize方法已经过时了AVAsset对象。 但是,应该始终这是指AVAsset的AVAssetTrack和AVAssetTrack有naturalSize方法,你可以调用。

naturalSize

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

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

可用性

可用在IOS 4.0及更高版本。 宣布AVAssetTrack.h

途经: 适用于iOS AVAssetTrack参考



Answer 2:

分辨率在斯威夫特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))
}

对于斯威夫特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没有为最新的设备有些视频返回正确的值!



Answer 3:

在官方文件弃用警告提示,“使用naturalSizepreferredTransform酌情资产的视频轨道,而不是(也见tracksWithMediaType:

我改变了我的代码:

CGSize size = [movieAsset naturalSize];

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

这是相当少,现在不太安全,但是当他们丢弃方法不会打破。



Answer 4:

弃用警告说:

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。



Answer 5:

以得出的尺寸AVAsset ,您应该计算所有的视觉轨迹rects联盟(应用其对应的优先改造后):

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个旋转),或者如果您的资产包含不同来源(轨道例如,两个曲目演奏并排侧与第二轨道的起源增强由第一轨道的宽度)。

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



Answer 6:

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


文章来源: AVURLAsset getting video size