iOS AVPlayer播放視訊的留白處理

盧三發表於2017-12-20

很多開發者使用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原始碼

相關文章