天天看點

阿裡雲移動端播放器進階功能---畫面控制

基本介紹

經常遇到一些開發者問:

1.我們播放的時候,會有黑邊怎麼處理?尤其是在類似于抖音,直播這樣的場景下,如果視訊有黑邊,很影響畫面的視覺效果。而阿裡雲播放器提供了縮放功能,用來去除黑邊,達到視訊全屏的效果。

2.直播時攝像頭采集經常會遇到反向的問題,就是采集出來的視訊畫面中的字是反的,對于這種情況怎麼處理呢?阿裡雲播放器提供了鏡像的功能,可以水準和垂直鏡像,讓畫面變成你想要的樣子。

3.對一些橫屏拍攝的視訊同時我們提供了旋轉功能,可以選擇90、270度,旋轉之後就可以實作全屏渲染了。

https://www.atatech.org/articles/131372#1 渲染模式設定

https://www.atatech.org/articles/131372#2 Android接口

播放器提供了

setVideoScalingMode

方法提供去改變畫面的大小。它可以設定兩種方式:

1. VIDEO_SCALING_MODE_SCALE_TO_FIT

按照視訊的寬高比,放到SurfaceView(TextureView)中。不會剪裁視訊畫面,畫面的内容是完整的。比如我的SurfaceView是1920:1080的,然後播放一個1280x720的視訊,如果使用FIT模式,最終顯示的話,播放器把1280x720這個視訊按照原始比例放大,直到寬或者高跟SurfaceView的寬或者高一直,最終隻有上下有黑邊或者左右有黑邊。

2. VIDEO_SCALING_MODE_SCALE_TO_FIT_WITH_CROPPING

按照視訊的寬高比,将畫面鋪滿SurfaceView(TextureView)中。此時會剪裁視訊的畫面,可能兩邊有部分内容不會被顯示。crop方式肯定是沒有黑邊的。

播放器預設的縮放效果為:VIDEO_SCALING_MODE_SCALE_TO_FIT。

VIDEO_SCALING_MODE_SCALE_TO_FIT_WITH_CROPPING 是以犧牲畫面的完整性為代價,進而實作了沒有黑邊。是以,當畫面的寬高比與實際的寬高比相差太大時,不太合适使用此配置。

我們來看具體的顯示效果,比如播放一個豎屏的視訊。

1.設定VIDEO_SCALING_MODE_SCALE_TO_FIT。即按照視訊的寬高比,放到SurfaceView(TextureView)中。

if (aliyunVodPlayer != null) {          
  aliyunVodPlayer.setVideoScalingMode(IAliyunVodPlayer.VideoScalingMode.VIDEO_SCALING_MODE_SCALE_TO_FIT);
}
           
阿裡雲移動端播放器進階功能---畫面控制

可以看到,有明顯的黑邊,但是畫面會被完整的顯示出來。

2.設定VIDEO_SCALING_MODE_SCALE_TO_FIT_WITH_CROPPING。即:按照視訊的寬高比,将畫面鋪滿SurfaceView(TextureView)中。

if (aliyunVodPlayer != null) { 
aliyunVodPlayer.setVideoScalingMode(IAliyunVodPlayer.VideoScalingMode.VIDEO_SCALING_MODE_SCALE_TO_FIT_WITH_CROPPING);
}
           
阿裡雲移動端播放器進階功能---畫面控制

可以看到,黑邊沒有了,但是畫面的部分内容已經看不到了。

https://www.atatech.org/articles/131372#3 iOS接口

iOS提供了一個屬性來擷取和設定渲染模式

@property(nonatomic, readwrite)  ScalingMode scalingMode;

enum {
    scalingModeAspectFit = 0,
    scalingModeAspectFitWithCropping = 1,
};
typedef NSInteger ScalingMode;
           

和Android類似,scalingModeAspectFit對應Android的VIDEO_SCALING_MODE_SCALE_TO_FIT,scalingModeAspectFitWithCropping對應Android的VIDEO_SCALING_MODE_SCALE_TO_FIT_WITH_CROPPING,具體接口說明和效果和Android一樣,在這裡不在贅述。

https://www.atatech.org/articles/131372#4 鏡像設定

https://www.atatech.org/articles/131372#5

iOS提供了如下接口來實作鏡像的設定,支援水準和垂直鏡像。

-(void) setRenderMirrorMode:(RenderMirrorMode)mirrorMode;

enum {
    renderMirrorModeNone = 0,
    renderMirrorHorizonMode,
    renderMirrorVerticalMode,
};
typedef NSInteger RenderMirrorMode;
           

水準鏡像

阿裡雲移動端播放器進階功能---畫面控制

垂直鏡像

阿裡雲移動端播放器進階功能---畫面控制

https://www.atatech.org/articles/131372#6

public void setRenderMirrorMode(VideoMirrorMode mirrorMode);
enum VideoMirrorMode {
      VIDEO_MIRROR_MODE_NONE(0),
      VIDEO_MIRROR_MODE_HORIZONTAL(1),
      VIDEO_MIRROR_MODE_VERTICAL(2);
}
           

https://www.atatech.org/articles/131372#7 旋轉設定

https://www.atatech.org/articles/131372#8

iOS提供了如下接口來實作旋轉的設定,旋轉支援0、90、180、270度的旋轉。

-(void) setRenderRotate:(RenderRotate)rotate;
enum {
    renderRotate0 = 0,
    renderRotate90 = 90,
    renderRotate180 = 180,
    renderRotate270 = 270,
};
typedef NSInteger RenderRotate;
           
阿裡雲移動端播放器進階功能---畫面控制

https://www.atatech.org/articles/131372#9

public void setRenderRotate(VideoRotate rotate);
    public static class VideoRotate {
        public static VideoRotate ROTATE_0 = new VideoRotate(0);
        public static VideoRotate ROTATE_90 = new VideoRotate(90);
        public static VideoRotate ROTATE_180 = new VideoRotate(180);
        public static VideoRotate ROTATE_270 = new VideoRotate(270);
    }           

繼續閱讀