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