Androidオーディオおよびビデオ開発シリーズ-MediaPlayerビデオウィンドウサイズの適応

一緒に書く習慣をつけましょう!「ナゲッツデイリーニュープラン・4月アップデートチャレンジ」に参加して3日目です。クリックしてイベントの詳細をご覧ください

序文

再生機能を使用した後MediaPlayer、ビデオ再生で解決する必要がある別の問題、つまり適応サイズの適応があります。デフォルトではSurfaceView、ビデオを再生すると、ビデオが引き伸ばされたり圧縮されたりする場合があります。

MediaPlayer内部ソリューション

ビデオリソース情報は次のとおりです。ビデオサイズはです1080x606。通常の再生状況では、幅が高さ表示よりも大きくなっています。

通常のプレイ ビデオ情報
7943e6f265e50978628e70c99effa919.jpg 9f8313a8b9c837f2c21730a12fb10e5e.jpg

MediaPlayerビデオ再生サイズ設定の内部サポート:VIDEO_SCALING_MODE_SCALE_TO_FITおよびVIDEO_SCALING_MODE_SCALE_TO_FIT_WITH_CROPPINGsetVideoScalingModeメソッドによって設定されます。次の図に2つの方法を示します。

VIDEO_SCALING_MODE_SCALE_TO_FIT VIDEO_SCALING_MODE_SCALE_TO_FIT_WITH_CROPPING
4dc6ed9459f9b2cb73a900fd6bed5c6d.jpg a2b43b3ddb489f0484dfc3a5e7b26aba.jpg

ただし、実際の効果が表示され、期待される効果を実現するには、ウィンドウサイズを変更して、事前サイズの調整を実現する必要があります。

適応スキーム

適応スキームのアルゴリズム設計は、ビデオの幅と高さの片側が画面全体に表示されるようにする必要があり(他の状況は当面考慮されないため)、デフォルトは画面サイズに基づいています。ここでも例として垂直スクリーンを取り上げますが、水平スクリーンは実際には同じソリューションです。

画面の垂直画面は全幅である必要があり、画面のアスペクト比を計算し、ビデオサイズを取得した後に画面のアスペクト比を使用するように事前に設計されています。画面の幅を動画サイズを拡大縮小した後の幅とし、動画サイズを拡大縮小した後の高さを計算します。最終的に計算されるサイズは、SurfaceViewビューウィンドウのサイズではありません。これにより、再生中のビデオのサイズが引き伸ばされます。

80ccc37a3e1f6ea9468ec7ea80837c3.jpg

コードセクション

MediaPlayerビデオサイズ情報は、ビデオリソースのロードの準備後に取得できます。先ほど申し上げましたようにgetTrackInfo()、動画サイズは取得できず、MediaExtractor実現する必要もありません。実際、MediaPlayer動画情報は準備ができたらすぐに取得できます。

 @Override
    public void onPrepared(MediaPlayer mp) {
        playerInfo.playerStatus = PREPARED;
        //获取到的资源不够查询详细数据
        int width = mp.getVideoWidth();
        int height = mp.getVideoHeight();
        playerInfo.videoSize = new Size(width,height);
        callbackInfo(playerInfo);
    }
复制代码

リソースの準備ができたら、コールバックで画面サイズが取得され、アルゴリズムがウィンドウサイズを計算して、ビデオサイズの適応を実現します。

@Override
public void onPlayerInfoCallBack(AndroidMediaPlayer.PlayerInfo playerInfo) {
    if(playerInfo.getPlayerStatus() == AndroidMediaPlayer.PREPARED){
        //屏幕比例
        Size size = ScreenUtils.getScreenSize(TestSimpleMediaPlayerActivity.this);
        //以宽为主
        Size videoSize = playerInfo.getVideoSize();
        //视频比例
        float videoRatio = videoSize.getWidth() / (float)videoSize.getHeight();
        float newHeight = size.getWidth() / videoRatio;
        LinearLayout.LayoutParams layoutParams =(LinearLayout.LayoutParams) surfaceView.getLayoutParams();
        layoutParams.height = (int)newHeight;
        // 重新设置窗口尺寸高
        surfaceView.setLayoutParams(layoutParams);
        androidMediaPlayer.start();
    }
}
复制代码

要約する

実際、ビデオ再生ウィンドウサイズは、最終的な再生ウィンドウサイズを変更することで設定できます。もちろん、画面サイズをベンチマークとして使用せずにウィンドウサイズを調整することもできます。たとえば、SurfaceView外部レイアウトウィンドウが正方形などです。これも実現できますが、表示効果があまり良くない場合があります。次に、ビデオサイズが内部でスケーリングおよびトリミングされている場合(16:9、3:4)、他のソリューションが必要になる場合があります。

おすすめ

転載: juejin.im/post/7084866365487579166