Android VLC编译后和TextTureView的联合使用

vlc,真是一个让人又爱又恨的播放器。爱,是因为他支持格式多样,恨,是因为复杂的编译,编译过后的使用也是一件让人头疼的事。现在就将自己使用过程中遇到的问题简单做一下记录。

使用编译好的vlc和TextTureView,播放视频,首先会遇到视频只是小小的一块儿。这就给自己的使用带来了很大的麻烦,在网上找了好久提供了一个改变大小的方法:

   private void updateVideoSurfaces() {
        int sw = framelayout.getWidth();
        int sh = framelayout.getHeight();

        // sanity check
        if (sw * sh == 0) {
            return;
        }

        mediaPlayer.getVLCVout().setWindowSize(sw, sh);

        ViewGroup.LayoutParams lp = videoview.getLayoutParams();
        if (mVideoWidth * mVideoHeight == 0) {
            /* Case of OpenGL vouts: handles the placement of the video using MediaPlayer API */
            lp.width = ViewGroup.LayoutParams.MATCH_PARENT;
            lp.height = ViewGroup.LayoutParams.MATCH_PARENT;
            videoview.setLayoutParams(lp);
            lp = framelayout.getLayoutParams();
            lp.width = ViewGroup.LayoutParams.MATCH_PARENT;
            lp.height = ViewGroup.LayoutParams.MATCH_PARENT;
            framelayout.setLayoutParams(lp);
            changeMediaPlayerLayout(sw, sh);
            return;
        }

        if (lp.width == lp.height && lp.width == ViewGroup.LayoutParams.MATCH_PARENT) {
            /* We handle the placement of the video using Android View LayoutParams */
            mediaPlayer.setAspectRatio(null);
            mediaPlayer.setScale(0);
        }

        double dw = sw, dh = sh;
        final boolean isPortrait = getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT;

        if (sw > sh && isPortrait || sw < sh && !isPortrait) {
            dw = sh;
            dh = sw;
        }

        // compute the aspect ratio
        double ar, vw;
        if (mVideoSarDen == mVideoSarNum) {
            /* No indication about the density, assuming 1:1 */
            vw = mVideoVisibleWidth;
            ar = (double) mVideoVisibleWidth / (double) mVideoVisibleHeight;
        } else {
            /* Use the specified aspect ratio */
            vw = mVideoVisibleWidth * (double) mVideoSarNum / mVideoSarDen;
            ar = vw / mVideoVisibleHeight;
        }

        // compute the display aspect ratio
        double dar = dw / dh;

        switch (CURRENT_SIZE) {
            case SURFACE_BEST_FIT:
                if (dar < ar)
                    dh = dw / ar;
                else
                    dw = dh * ar;
                break;
            case SURFACE_FIT_SCREEN:
                if (dar >= ar)
                    dh = dw / ar; /* horizontal */
                else
                    dw = dh * ar; /* vertical */
                break;
            case SURFACE_FILL:
                break;
            case SURFACE_16_9:
                ar = 16.0 / 9.0;
                if (dar < ar)
                    dh = dw / ar;
                else
                    dw = dh * ar;
                break;
            case SURFACE_4_3:
                ar = 4.0 / 3.0;
                if (dar < ar)
                    dh = dw / ar;
                else
                    dw = dh * ar;
                break;
            case SURFACE_ORIGINAL:
                dh = mVideoVisibleHeight;
                dw = vw;
                break;
        }

        // set display size
        lp.width = (int) Math.ceil(dw * mVideoWidth / mVideoVisibleWidth);
        lp.height = (int) Math.ceil(dh * mVideoHeight / mVideoVisibleHeight);
        videoview.setLayoutParams(lp);

        // set frame size (crop if necessary)
        lp = framelayout.getLayoutParams();
        lp.width = (int) Math.floor(dw);
        lp.height = (int) Math.floor(dh);
        framelayout.setLayoutParams(lp);

        videoview.invalidate();
    }
private void changeMediaPlayerLayout(int displayW, int displayH) {
    /* Change the video placement using the MediaPlayer API */
    switch (CURRENT_SIZE) {
        case SURFACE_BEST_FIT:
            mediaPlayer.setAspectRatio(null);
            mediaPlayer.setScale(0);
            break;
        case SURFACE_FIT_SCREEN:
        case SURFACE_FILL: {
            Media.VideoTrack vtrack = mediaPlayer.getCurrentVideoTrack();
            if (vtrack == null)
                return;
            final boolean videoSwapped = vtrack.orientation == Media.VideoTrack.Orientation.LeftBottom
                    || vtrack.orientation == Media.VideoTrack.Orientation.RightTop;
            if (CURRENT_SIZE == SURFACE_FIT_SCREEN) {
                int videoW = vtrack.width;
                int videoH = vtrack.height;

                if (videoSwapped) {
                    int swap = videoW;
                    videoW = videoH;
                    videoH = swap;
                }
                if (vtrack.sarNum != vtrack.sarDen)
                    videoW = videoW * vtrack.sarNum / vtrack.sarDen;

                float ar = videoW / (float) videoH;
                float dar = displayW / (float) displayH;

                float scale;
                if (dar >= ar)
                    scale = displayW / (float) videoW; /* horizontal */
                else
                    scale = displayH / (float) videoH; /* vertical */
                mediaPlayer.setScale(scale);
                mediaPlayer.setAspectRatio(null);
            } else {
                mediaPlayer.setScale(0);
                mediaPlayer.setAspectRatio(!videoSwapped ? "" + displayW + ":" + displayH
                        : "" + displayH + ":" + displayW);
            }
            break;
        }
        case SURFACE_16_9:
            mediaPlayer.setAspectRatio("16:9");
            mediaPlayer.setScale(0);
            break;
        case SURFACE_4_3:
            mediaPlayer.setAspectRatio("4:3");
            mediaPlayer.setScale(0);
            break;
        case SURFACE_ORIGINAL:
            mediaPlayer.setAspectRatio(null);
            mediaPlayer.setScale(1);
            break;
    }
}

通过这两个方法是可以解决在全屏状态下铺满控件的画面。但是当您切换到半屏时,就会出现上下游黑边的情况,甚是让人脑壳疼。在经过了多次度娘的帮助后,终于找到了一个既方便又简洁的实现方式。

在这里

mediaPlayer.getVLCVout().attachViews(new IVLCVout.OnNewVideoLayoutListener() {
    @Override
    public void onNewVideoLayout(IVLCVout ivlcVout, int i, int i1, int i2, int i3, int i4, int i5) {
        updateVideoSurfaces();
    }
});
private void updateVideoSurfaces() {
    int sw = framelayout1.getWidth();
    int sh = framelayout1.getHeight();
    mediaPlayer.getVLCVout().setWindowSize(sw,sh);
    mediaPlayer.setAspectRatio(sw+":"+sh);
    mediaPlayer.setScale(0);
    videoview.invalidate();
}

这样您就可以愉快的开始玩耍了

猜你喜欢

转载自blog.csdn.net/qq_29247839/article/details/85245794
今日推荐