【问题标题】:Borders using AVPlayer in SwiftUI在 SwiftUI 中使用 AVPlayer 的边框
【发布时间】:2021-03-24 05:53:30
【问题描述】:

几天以来我一直在使用 SwiftUI,目前我正在尝试实现一个视频播放器,但我正在努力解决大小问题。

这是我的视图代码:

struct test: View {
    var body: some View {
        PlayerView()
            .aspectRatio(contentMode: .fit)
            .background(Color.blue)
    }
}

这就是 PlayerView() 里面的内容

class PlayerUIView: UIView {
  private let playerLayer = AVPlayerLayer()

  override init(frame: CGRect) {
    super.init(frame: frame)
    
    let url = URL(string: "http://devimages.apple.com/iphone/samples/bipbop/bipbopall.m3u8")!
    let player = AVPlayer(url: url)
    player.isMuted = true
    player.play()
    
    playerLayer.player = player
    playerLayer.videoGravity = AVLayerVideoGravity.resizeAspect
    layer.addSublayer(playerLayer)
  }

  required init?(coder: NSCoder) {
     fatalError("init(coder:) has not been implemented")
  }

  override func layoutSubviews() {
    super.layoutSubviews()
    playerLayer.frame = bounds
  }
}

使用这段代码我得到了这个:

我想去掉这个额外的边框(我们可以看到蓝色),但我不知道该怎么做。

我尝试将 playerLayer 的 videoGravity 属性设置为:

  • 调整大小:我没有边框了,但是视频被拉伸了
  • resizeAspectFill:我没有边框了,但是视频被剪掉了

如何在保留视频提供的原始比例和大小的同时去除这些边框?

【问题讨论】:

  • 将背景颜色改为白色?
  • 谢谢,但这并没有解决问题,帧仍然比视频本身大。
  • 所以让frame和player frame一样?
  • 只有当视图和视频具有相同的纵横比时,您才能实现目标。请参阅stackoverflow.com/a/7868633/22147 进行类似讨论。

标签: ios swift swiftui avfoundation avplayer


【解决方案1】:

我设法使它以这种方式工作:

查看代码

struct test: View {
    var body: some View {
        PlayerView()
            .edgesIgnoringSafeArea(.all)
            .scaledToFill()
     }
}

PlayerUIView.swift

class PlayerUIView: UIView {
    private let playerLayer = AVPlayerLayer()

    override init(frame: CGRect) {
        super.init(frame: frame)

        let url = URL(string: "http://devimages.apple.com/iphone/samples/bipbop/bipbopall.m3u8")!
        let player = AVPlayer(url: url)
        player.isMuted = true
        player.play()

        playerLayer.player = player
        playerLayer.videoGravity = AVLayerVideoGravity.resizeAspect
        layer.addSublayer(playerLayer)
    }

    required init?(coder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }

    override func layoutSubviews() {
        super.layoutSubviews()
        playerLayer.frame = bounds
    }
}

【讨论】:

    猜你喜欢
    • 2020-09-15
    • 2022-07-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-11
    • 2020-03-05
    • 2020-06-14
    • 2021-08-30
    相关资源
    最近更新 更多