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(); }
这样您就可以愉快的开始玩耍了