iOS AVPlayer播放视频的留白处理

作者: 卢叁 | 来源:发表于2017-11-10 11:45 被阅读58次
    很多开发者使用AVPlayer播放视频的时候,会出现留白的问题,使得页面效果不是很好,如下图: 屏幕快照 2017-11-10 上午11.03.48.png

    以上可以看出,在不知道视频宽高比的时候,给player一个预设高度,如果项目中背景色不是深色的时候,会达不到产品的要求。众所周知,苹果官方提供了三种填充模式:

    /**
     AVPlayerLayer的videoGravity属性设置
     AVLayerVideoGravityResize,       // 非均匀模式。两个维度完全填充至整个视图区域
     AVLayerVideoGravityResizeAspect,  // 等比例填充,直到一个维度到达区域边界
     AVLayerVideoGravityResizeAspectFill, // 等比例填充,直到填充满整个视图区域,其中一个维度的部分区域会被裁剪
     */
    @property (nonatomic, copy) NSString         *videoGravity;
    

    我们一般都默认使用的是AVLayerVideoGravityResizeAspect ,因为使用其他两种模式会拉伸视频,导致变形。那么问题来了,想使用AVLayerVideoGravityResizeAspect,又想不留白,该怎么处理呢?有种办法是:取得视频的宽高比,不预设高度,根据视频页面所在的宽度和取得视频的宽高比决定视频页面的高度,这样一来,可以解决留白的问题。
    取得视频宽高比的方法:

    //获取视频宽高比
    - (CGFloat )getVideoScale:(NSURL *)URL{
        //获取视频尺寸
        AVURLAsset *asset = [AVURLAsset assetWithURL:URL];
        
        NSArray *array = asset.tracks;
        CGSize videoSize = CGSizeZero;
        for (AVAssetTrack *track in array) {
            if ([track.mediaType isEqualToString:AVMediaTypeVideo]) {
                videoSize = track.naturalSize;
            }
        }
        
      return videoSize.height/videoSize.width;
    }
    

    如此一来,我们只需要根据这个比例来设定高度:

    self.playerView.frame =CGRectMake(0,64,ScreenWidth,ScreenWidth*scale);
    

    效果如图:


    屏幕快照 2017-11-10 上午11.43.17.png

    GitHub源码

    相关文章

      网友评论

        本文标题:iOS AVPlayer播放视频的留白处理

        本文链接:https://www.haomeiwen.com/subject/yufbmxtx.html