Swift - 如何获取视频尺寸?

问题描述 投票:0回答:3

我正在开发一个视频编辑应用程序,其中每个视频都以这样的方式进行平方,视频的任何部分都不会被裁剪。为此,在纵向视频的情况下,它在左侧和右侧包含黑色部分,对于横向视频,它包含黑色部分视频顶部和底部包含黑色部分。黑色部分是视频的一部分,不是为了

AVPlayerViewController
。这是示例,

我需要用一些

CALayers
覆盖这些黑色部分。

CALayer的框架(

CGRect
)是什么?

我使用

naturalSize
属性获取视频尺寸,其中包括黑色部分。

有没有办法获得没有黑色部分的视频尺寸?(我的意思是实际视频内容的尺寸)或 有没有办法获取视频黑色区域的

CGRect

ios swift video size
3个回答
55
投票
func initAspectRatioOfVideo(with fileURL: URL) -> Double {
  let resolution = resolutionForLocalVideo(url: fileURL)
  guard let width = resolution?.width, let height = resolution?.height else {
     return 0
  }
  return Double(height / width)
}

private func resolutionForLocalVideo(url: URL) -> CGSize? {
    guard let track = AVURLAsset(url: url).tracks(withMediaType: AVMediaType.video).first else { return nil }
   let size = track.naturalSize.applying(track.preferredTransform)
   return CGSize(width: abs(size.width), height: abs(size.height))
}

对于visionOS:

guard let track = (try? await AVURLAsset(url: url).loadTracks(withMediaType: AVMediaType.video))?.first,
      let (naturalSize, preferredTransform) = try? await videoTrack.load(.naturalSize, .preferredTransform) else { return nil }
let size = naturalSize.applying(preferredTransform)
...

5
投票

这是Vlad Pulichev 的答案的更简洁版本。

var aspectRatio: CGFloat! // use the function to assign your variable

func getVideoResolution(url: String) -> CGFloat? {
    guard let track = AVURLAsset(url: URL(string: url)!).tracks(withMediaType: AVMediaType.video).first else { return nil }
    let size = track.naturalSize.applying(track.preferredTransform)
    return abs(size.height) / abs(size.width)
}

1
投票

~新

func getVideoResolution(url: String) async throws -> CGSize? {
        guard let track = try await AVURLAsset(url: URL(string: url)!).loadTracks(withMediaType: AVMediaType.video).first else { return nil }
        let size = try await track.load(.naturalSize).applying(track.load(.preferredTransform))
        return size
}
© www.soinside.com 2019 - 2024. All rights reserved.