首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >AVURLAsset获取视频大小

AVURLAsset获取视频大小
EN

Stack Overflow用户
提问于 2012-05-03 22:46:08
回答 4查看 39.6K关注 0票数 28

这是相当令人沮丧的。我正在尝试获取AVURLasset的大小,但尽量避免使用naturalSize,因为Xcode告诉我,在iOS5中这是不推荐使用的。

但是:替代方案是什么?

我找不到任何关于如何获得视频尺寸的线索,而不使用«naturalsize»...

EN

回答 4

Stack Overflow用户

发布于 2015-12-19 06:36:01

Swift 3中的分辨率:

代码语言:javascript
复制
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:

代码语言:javascript
复制
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的解决方案不会为最新设备上的某些视频返回正确的值!

票数 45
EN

Stack Overflow用户

发布于 2013-08-20 08:16:01

deprecation warning on the official documentation建议,“在适当的情况下,使用资产视频轨道的naturalSizepreferredTransform (请参阅tracksWithMediaType:)。”

我将我的代码从:

代码语言:javascript
复制
CGSize size = [movieAsset naturalSize];

代码语言:javascript
复制
CGSize size = [[[movieAsset tracksWithMediaType:AVMediaTypeVideo] objectAtIndex:0] naturalSize];

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

票数 26
EN

Stack Overflow用户

发布于 2017-03-10 09:21:42

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

代码语言:javascript
复制
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()

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10433774

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档