正常还是建议用mediaplayer+sufaceview 实现视频播放。但是由于只是实现简单的播放功能我就使用了videoview,用videoview播放视频存在的问题就是在固定好的宽高内播放视频不是原始视频比例,所以这就需要做出一些设置更改。
关键的问题是获取视频的宽高有了这个就可以自定义的去设置播放的视频比例
通过onPrepared回调获取mediaplayer对象,这样我们就可以获取到了视频的kuanga
mVideoView.setOnPreparedListener(new MediaPlayer.OnPreparedListener() { @Override public void onPrepared(MediaPlayer mp) { mp.setOnVideoSizeChangedListener(new MediaPlayer.OnVideoSizeChangedListener() { @Override public void onVideoSizeChanged(MediaPlayer mp, int width, int height) { //FixMe 获取视频资源的宽度 mVideoWidth = mp.getVideoWidth(); //FixMe 获取视频资源的高度 mVideoHeight = mp.getVideoHeight(); scale = (float) mVideoWidth / (float) mVideoHeight; refreshPortraitScreen(showVideoHeight == 0 ? DensityUtil.dip2px(context, 300) : showVideoHeight); } }); } });
//重新刷新 竖屏显示的大小 树屏显示以宽度为准 public void refreshPortraitScreen(int height) { if (height == 0) { height = showVideoHeight; } if (mVideoHeight > 0 && mVideoWidth > 0) { //FixMe 拉伸比例 mVideoWidth = (int) (height * scale);//FixMe 设置surfaceview画布大小 // mVideoHeight = (int) (mVideoWidth / scale); mVideoView.getHolder().setFixedSize(mVideoWidth, height); L.i("竖屏时视频的宽高==", "宽=" + mVideoWidth + ",高=" + mVideoHeight); //FixMe 重绘VideoView大小,这个方法是在重写VideoView时对外抛出方法 mVideoView.setMeasure(mVideoWidth, height); //FixMe 请求调整 mVideoView.requestLayout(); } } ds
refreshPortraitScreen(int height) 方法就是根据视频宽高的比例来重新绘制 画布和 VideoView的大小。这样我们就可以自定义的显示视频并且保持原始比例。
public class DiyVideoView extends VideoView { private int width; private int height; public DiyVideoView(Context context) { super(context); } public DiyVideoView(Context context, AttributeSet attrs) { super(context, attrs); } public void setMeasure(int width, int height) { this.width = width; this.height = height; } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { super.onMeasure(widthMeasureSpec, heightMeasureSpec); // 默认高度,为了自动获取到focus int width = MeasureSpec.getSize(widthMeasureSpec); int height = width; // 这个之前是默认的拉伸图像 if (this.width > 0 && this.height > 0) { width = this.width; height = this.height; } setMeasuredDimension(width, height); } }