Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1570903
  • 博文数量: 113
  • 博客积分: 3526
  • 博客等级: 中校
  • 技术积分: 1815
  • 用 户 组: 普通用户
  • 注册时间: 2009-09-08 09:46
个人简介

记录总结自己的工作

文章分类

全部博文(113)

文章存档

2015年(19)

2014年(10)

2013年(6)

2012年(16)

2011年(24)

2010年(21)

2009年(17)

分类: Android平台

2014-03-20 09:21:37

      最近因为自己感兴趣就开始做个视频播放器。使用了全屏状态下的SurfaceView来播放视频,但是播放时却发现有些视频可以很好的播放,有些却被拉伸了,视频看起来是被“压扁”了的感觉。看到网上有重写一个SurfaceView的例子,感觉那是一种方法,但是我对这个问题有自己的理解:问题产生的原因就是SurfaceView的长宽比和视频本身的长宽比不相等,所以根据视频的长宽比调整一下SurfaceView的长宽比不就可以了吗?所以有了如下的方法:

      首先,我们来获取一下手机屏幕的长宽,因为全屏状态下,视频的高度就是手机的宽度,我们所要做的就是在这个视频高度的基础上将SurfaceView的宽度给缩小一点:


点击(此处)折叠或打开

  1. DisplayMetrics dm = new DisplayMetrics();
  2.         getWindowManager().getDefaultDisplay().getMetrics(dm);
  3.         mSurfaceViewWidth = dm.widthPixels;
  4.         mSurfaceViewHeight = dm.heightPixels;

        因为在布局文件里,对SurfaceView的长宽都是match_parent的,所要一开始SurfaceView的大小和手机屏幕是相等的。下面来重写一下onVideoSizeChanged的方法就可以了。
 在这里我们根据视频的大小和屏幕的宽度来计算出SurfaceView应该在左右空出多少来就可以了:


点击(此处)折叠或打开

  1. @Override
  2.     public void onVideoSizeChanged(MediaPlayer mp, int width, int height) {
  3.         if (width == 0 || height == 0) {
  4.             Log.e(TAG, "invalid video width(" + width + ") or height(" + height
  5.                     + ")");
  6.             return;
  7.         }
  8.         Logger.d(TAG, "onVideoSizeChanged width:" + width + " height:" + height);
  9.         mIsVideoSizeKnown = true;
  10.         mVideoHeight = height;
  11.         mVideoWidth = width;

  12.         int w = mSurfaceViewHeight * width / height;
  13.         int margin = (mSurfaceViewWidth - w) / 2;
  14.         Logger.d(TAG, "margin:" + margin);
  15.         RelativeLayout.LayoutParams lp = new RelativeLayout.LayoutParams(
  16.                 RelativeLayout.LayoutParams.MATCH_PARENT,
  17.                 RelativeLayout.LayoutParams.MATCH_PARENT);
  18.         lp.setMargins(margin, 0, margin, 0);
  19.         mSurfaceView.setLayoutParams(lp);

  20.         if (mIsVideoReadyToBePlayed && mIsVideoSizeKnown) {
  21.             startVideoPlayback();
  22.         }

  23.     }

         好了,实验一下,果然可以了。







阅读(26735) | 评论(2) | 转发(2) |
给主人留下些什么吧!~~

云少嘎嘎嘎2014-03-24 12:23:03

xdsnet:片面了,应该根据视频属性和播放形式进行适配。

恩,对于横屏录制的视频可以,但是对于竖屏录制的视频显示还是有问题。

回复 | 举报

xdsnet2014-03-20 22:36:50

片面了,应该根据视频属性和播放形式进行适配。