AVPlayer纵横比

时间:2018-08-12 06:27:38

标签: ios swift avplayer avplayerviewcontroller

好吧,所以在我的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
    }

非常感谢您的帮助

2 个答案:

答案 0 :(得分:0)

我不确定,但是使用这个:

playerController.view.frame = view.bounds

代替此:

playerController.view.frame = view.frame

AVLayerVideoGravity.resizeAspectFill.rawValue应该按照说的做,而我从来没有遇到过问题。但是,我使用边界而不是框架,并且记得使用框架时遇到问题。

您还有AVLayerVideoGravity.resizeAspect.rawValue个适合视频而不是填充视频的视频。

您也可以尝试在视频重力之前设置帧。

答案 1 :(得分:0)

将视频宽高比保持在已定义的视角范围内 AVLayerVideoGravity.resizeAspect。 对于当前情况,请更换 playerController.videoGravity = AVLayerVideoGravity.resizeAspectFill.rawValueplayerController.videoGravity = AVLayerVideoGravity.resizeAspect