簡體   English   中英

AVPlayer 縱橫比

[英]AVPlayer Aspect Ratio

好的,所以在我的 iOS 應用程序中有一個帶有 AVPlayerViewController 的屏幕,用於播放視頻。 播放此視頻時,它會填滿整個屏幕,但在某些視頻上,它們的視頻似乎被拉伸,好像被迫適應一樣。 有什么方法可以使視頻適合整個屏幕而不會丟失縱橫比。

下面的代碼是我用來布置 AVPlayerController 的。 我認為這里的一些錯誤是導致縱橫比缺陷的原因。

/

// Setup the view for stories
    private func setupViews() {
        view.backgroundColor = .clear
        // Setup the blur view for loading
        blurView = UIVisualEffectView(frame: view.frame)
        blurView.effect = UIBlurEffect(style: .regular)

        self.view.addSubview(blurView)

        // Indicator for loading
        let indicatorFrame = CGRect(x: view.center.x - 20, y: view.center.y - 20, width: 40, height: 40)
        indicator = UIActivityIndicatorView(frame: indicatorFrame)
        indicator.hidesWhenStopped = true
        indicator.activityIndicatorViewStyle = .whiteLarge

        blurView.contentView.addSubview(indicator)

        // Setup the Progress bar
//        spb = SegmentedProgressBar(numberOfSegments: allStories.count)
////        spb.frame = CGRect(x: 0, y: 1, width: self.view.frame.width, height: 9)
//        self.view.addSubview(spb)
//        spb.snp.makeConstraints { (make) in
//            make.left.right.equalTo(view.safeAreaLayoutGuide)
//            make.top.equalTo(view.safeAreaLayoutGuide.snp.top).offset(1)
//            make.height.equalTo(9)
//        }
//
//        spb.delegate = self

        // Player Controller
        playerController = AVPlayerViewController()
        playerController.showsPlaybackControls = false

        self.addChildViewController(playerController)

        // Image view for the story
        imageView = UIImageView(frame: self.view.frame)

        infoView = UIView(frame: self.view.frame)
        infoView.backgroundColor = UIColor.clear

        // The image view for the user of the current story
        infoImageView = UIImageView()
        self.view.addSubview(imageView)
        self.view.addSubview(playerController.view)
//        self.view.bringSubview(toFront: spb)

        self.view.addSubview(infoView)

        self.infoView.addSubview(infoImageView)

        infoImageView.snp.makeConstraints { (make) in
            make.top.equalTo(view.safeAreaLayoutGuide.snp.top).offset(2)
            make.left.equalTo(view.safeAreaLayoutGuide.snp.left).offset(10)
            make.height.width.equalTo(30)
        }
        infoImageView.layer.cornerRadius = 15
        infoImageView.layer.masksToBounds = true

        // The name for the user of the current story
        infoNameLabel = UILabel()
        infoNameLabel.backgroundColor = UIColor.black.withAlphaComponent(0.1)
        infoNameLabel.textColor = UIColor.white
        infoNameLabel.font = UIFont.boldSystemFont(ofSize: 18)
        infoNameLabel.adjustsFontSizeToFitWidth = true

        self.infoView.addSubview(infoNameLabel)

        infoNameLabel.snp.makeConstraints { (make) in
            make.left.equalTo(infoImageView.snp.right).offset(5)
            make.top.equalTo(view.safeAreaLayoutGuide.snp.top).offset(2)
            make.height.equalTo(30)
            make.width.equalTo(80)
        }

        // Time label for long ago the story was posted
        infoTimeLabel = UILabel()
        infoTimeLabel.backgroundColor = UIColor.black.withAlphaComponent(0.1)
        infoTimeLabel.textColor = UIColor.white

        self.infoView.addSubview(infoTimeLabel)

        infoTimeLabel.snp.makeConstraints { (make) in
            make.left.equalTo(infoNameLabel.snp.right).offset(5)
            make.top.equalTo(view.safeAreaLayoutGuide.snp.top).offset(2)
            make.height.equalTo(30)
            make.width.equalTo(50)
        }

        infoView.isUserInteractionEnabled = true
        infoView.addGestureRecognizer(tapInfoView)
        infoView.addGestureRecognizer(swipeInfoView)

        infoTimeLabel.layer.cornerRadius = 10
        infoTimeLabel.layer.masksToBounds = true
        infoTimeLabel.textAlignment = .center

        infoNameLabel.layer.cornerRadius = 10
        infoNameLabel.layer.masksToBounds = true
        infoNameLabel.textAlignment = .center

        playerController.videoGravity = AVLayerVideoGravity.resizeAspectFill.rawValue
        playerController.view.frame = view.frame

//        spb.durations = durations
    }

任何幫助是極大的贊賞

我不確定,但使用這個:

playerController.view.frame = view.bounds

取而代之的是:

playerController.view.frame = view.frame

AVLayerVideoGravity.resizeAspectFill.rawValue應該按照所說的去做,我從來沒有遇到過問題。 但是,我使用邊界而不是框架,我記得在使用框架時遇到問題。

您還有AVLayerVideoGravity.resizeAspect.rawValue將適合視頻而不是填充它。

您也可以嘗試在視頻重力之前設置幀。

使用AVLayerVideoGravity.resizeAspect在定義的視圖框架中保持視頻縱橫比。 對於當前情況,將playerController.videoGravity = AVLayerVideoGravity.resizeAspectFill.rawValue替換為playerController.videoGravity = AVLayerVideoGravity.resizeAspect

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM