这真的很令人沮丧。我试图获取一个AVURLasset的大小,但尝试避免使用naturalSize
,因为Xcode告诉我在iOS5中已经被弃用。
但是:有什么替代方法吗?
我找不到任何线索,不使用«naturalsize»如何获取视频尺寸...
这真的很令人沮丧。我试图获取一个AVURLasset的大小,但尝试避免使用naturalSize
,因为Xcode告诉我在iOS5中已经被弃用。
但是:有什么替代方法吗?
我找不到任何线索,不使用«naturalsize»如何获取视频尺寸...
在 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
的解决方案在最新设备上无法为某些视频返回正确的值!
官方文档上的废弃警告建议: "如适用,使用资产视频轨道的naturalSize
和preferredTransform
(另请参见tracksWithMediaType:
)"。
我从以下代码进行了更改:
CGSize size = [movieAsset naturalSize];
"to"CGSize size = [[[movieAsset tracksWithMediaType:AVMediaTypeVideo] objectAtIndex:0] naturalSize];
现在不太美观也不太安全,但是当他们使用该方法时不会崩溃。
这个弃用警告的意思是:
Use the naturalSize and preferredTransform, as appropriate,
of the asset’s video tracks instead (see also tracksWithMediaType:).
我们需要一个AVAssetTrack,并且想要它的naturalSize和preferredTransform。可以通过以下方式访问:
AVAssetTrack *track = [[asset tracksWithMediaType:AVMediaTypeVideo] firstObject];
CGSize dimensions = CGSizeApplyAffineTransform(track.naturalSize, track.preferredTransform);
资产显然是您的AVAsset。
fabsf()
函数对尺寸组件进行归一化处理。 - Ja͢ckAVAsset
扩展,用于在 Swift 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
}
}
AVAsset
的尺寸,您需要计算所有视觉轨道矩形的并集(在应用它们的对应首选转换之后):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
对于 iOS 版本 15.0 及以上,
extension AVAsset {
func naturalSize() async -> CGSize? {
guard let tracks = try? await loadTracks(withMediaType: .video) else { return nil }
guard let track = tracks.first else { return nil }
guard let size = try? await track.load(.naturalSize) else { return nil }
return size
}
}
针对Swift 5版本
let assetSize = asset.tracks(withMediaType: .video)[0].naturalSize
Swift 版本的 @David_H 的答案。
extension AVAsset {
func resolutionSizeForLocalVideo() -> CGSize {
var unionRect = CGRect.zero;
for track in self.tracks(withMediaCharacteristic: .visual) {
let trackRect = CGRect(x: 0, y: 0, width:
track.naturalSize.width, height:
track.naturalSize.height).applying(track.preferredTransform)
unionRect = unionRect.union(trackRect)
}
return unionRect.size
}
}
unionRect
设置为CGRect.zero
。我已经编辑过了。 - sagarthecoder
nautralSize
在 iOS 5 中已被弃用。 - RaptornaturalSize
的属性。AVURLAsset.naturalSize
已被弃用,但是[[[videoAsset tracksWithMediaType:AVMediaTypeVideo] objectAtIndex:0] naturalSize]
没有。 - RaptorAVAssetTrack
方法,这个方法并没有被弃用,正如Dave在下面的第二行代码中所指定的那样...看起来我只是忘记在我的答案中添加这一行代码了。 - C4 - Travis