Android使用SurfaceView播放视频时横竖屏的调整
2014-11-28 09:19
597 查看
我个人看视频的时候喜欢横屏看,这样视频图像显得还大,所以在做自己的播放器的时候默认就是横屏显示。这样在播放横屏录制的视频时没有问题,但是一旦播放竖屏录制的视频问题就大了,图像都是偏转90度的。这可怎么办呢?我的解决思路:
1.将SurfaceView偏转90度,结果黑呼呼一片啥都不显示。
2.将包含SurfaceView的layout偏转90度,结果还是一片黑呼呼。
3.上网搜索类似的问题,发现有人提问但是都没有解决方案。
4.观察一下系统自带的播放器吧,发现其横竖屏的切换很流畅,而且在横屏播放手机竖屏录制的视频时也会出现偏转90度的情况。但是系统播放器播放这种视频时默认是竖屏显示的,所以我们可以学习一下,不用那么死板必须横屏,而是根据视频的属性动态调整。
5.解决方案:对于横屏录制的视频就横屏播放,对于竖屏录制的视频就竖屏播放,这样只要调整布局的横竖屏就可以了。
6.鉴于应用在横竖屏切换的时候会将Activity重新创建,所以视频会重新从头开始播放,所以我们要做一下准备:
在mainifest文件里对负责播放的Activity添加以下属性
点击(此处)折叠或打开
android:configChanges="orientation|keyboardHidden|screenSize"
重写Acitivity的onConfigurationChanged方法:
点击(此处)折叠或打开
@Override
public
void onConfigurationChanged(Configuration
newConfig)
{
super.onConfigurationChanged(newConfig);
}
接下来重点来了,在上文对视频比例的调整中,我只考虑了横屏录制视频的情况,这下我们要根据视频的属性来区分对待了:
点击(此处)折叠或打开
@Override
public
void onVideoSizeChanged(MediaPlayer mp,
int
width,
int height)
{
if
(width
== 0
||
height
== 0)
{
Log.e(TAG,
"invalid video width("
+ width
+ ") or height("
+ height
+
")");
return;
}
Logger.d(TAG,
"onVideoSizeChanged width:"
+ width
+ " height:"
+ height);
mIsVideoSizeKnown = true;
mVideoHeight =
height;
mVideoWidth =
width;
int wid
= mMediaPlayer.getVideoWidth();
int hig
= mMediaPlayer.getVideoHeight();
// 根据视频的属性调整其显示的模式
if
(wid
> hig)
{
if
(getRequestedOrientation()
!= ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE)
{
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
}
}
else
{
if
(getRequestedOrientation()
!= ActivityInfo.SCREEN_ORIENTATION_PORTRAIT)
{
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
}
}
DisplayMetrics dm =
new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(dm);
mSurfaceViewWidth = dm.widthPixels;
mSurfaceViewHeight = dm.heightPixels;
if
(width
>
height)
{
// 竖屏录制的视频,调节其上下的空余
int w
= mSurfaceViewHeight
*
width /
height;
int margin
=
(mSurfaceViewWidth - w)
/ 2;
Logger.d(TAG,
"margin:"
+ margin);
RelativeLayout.LayoutParams lp
=
new RelativeLayout.LayoutParams(
RelativeLayout.LayoutParams.MATCH_PARENT,
RelativeLayout.LayoutParams.MATCH_PARENT);
lp.setMargins(margin,
0, margin, 0);
mSurfaceView.setLayoutParams(lp);
}
else
{
// 横屏录制的视频,调节其左右的空余
int h
= mSurfaceViewWidth
*
height /
width;
int margin
=
(mSurfaceViewHeight - h)
/ 2;
Logger.d(TAG,
"margin:"
+ margin);
RelativeLayout.LayoutParams lp
=
new RelativeLayout.LayoutParams(
RelativeLayout.LayoutParams.MATCH_PARENT,
RelativeLayout.LayoutParams.MATCH_PARENT);
lp.setMargins(0,
margin, 0, margin);
mSurfaceView.setLayoutParams(lp);
}
}
这样不管横屏还是竖屏录制的视频都可以正常的显示了。当然我默认的都是横屏观看,如果在播放的时候要做横竖屏的切换也可以按照这个方法来。
1.将SurfaceView偏转90度,结果黑呼呼一片啥都不显示。
2.将包含SurfaceView的layout偏转90度,结果还是一片黑呼呼。
3.上网搜索类似的问题,发现有人提问但是都没有解决方案。
4.观察一下系统自带的播放器吧,发现其横竖屏的切换很流畅,而且在横屏播放手机竖屏录制的视频时也会出现偏转90度的情况。但是系统播放器播放这种视频时默认是竖屏显示的,所以我们可以学习一下,不用那么死板必须横屏,而是根据视频的属性动态调整。
5.解决方案:对于横屏录制的视频就横屏播放,对于竖屏录制的视频就竖屏播放,这样只要调整布局的横竖屏就可以了。
6.鉴于应用在横竖屏切换的时候会将Activity重新创建,所以视频会重新从头开始播放,所以我们要做一下准备:
在mainifest文件里对负责播放的Activity添加以下属性
点击(此处)折叠或打开
android:configChanges="orientation|keyboardHidden|screenSize"
重写Acitivity的onConfigurationChanged方法:
点击(此处)折叠或打开
@Override
public
void onConfigurationChanged(Configuration
newConfig)
{
super.onConfigurationChanged(newConfig);
}
接下来重点来了,在上文对视频比例的调整中,我只考虑了横屏录制视频的情况,这下我们要根据视频的属性来区分对待了:
点击(此处)折叠或打开
@Override
public
void onVideoSizeChanged(MediaPlayer mp,
int
width,
int height)
{
if
(width
== 0
||
height
== 0)
{
Log.e(TAG,
"invalid video width("
+ width
+ ") or height("
+ height
+
")");
return;
}
Logger.d(TAG,
"onVideoSizeChanged width:"
+ width
+ " height:"
+ height);
mIsVideoSizeKnown = true;
mVideoHeight =
height;
mVideoWidth =
width;
int wid
= mMediaPlayer.getVideoWidth();
int hig
= mMediaPlayer.getVideoHeight();
// 根据视频的属性调整其显示的模式
if
(wid
> hig)
{
if
(getRequestedOrientation()
!= ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE)
{
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
}
}
else
{
if
(getRequestedOrientation()
!= ActivityInfo.SCREEN_ORIENTATION_PORTRAIT)
{
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
}
}
DisplayMetrics dm =
new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(dm);
mSurfaceViewWidth = dm.widthPixels;
mSurfaceViewHeight = dm.heightPixels;
if
(width
>
height)
{
// 竖屏录制的视频,调节其上下的空余
int w
= mSurfaceViewHeight
*
width /
height;
int margin
=
(mSurfaceViewWidth - w)
/ 2;
Logger.d(TAG,
"margin:"
+ margin);
RelativeLayout.LayoutParams lp
=
new RelativeLayout.LayoutParams(
RelativeLayout.LayoutParams.MATCH_PARENT,
RelativeLayout.LayoutParams.MATCH_PARENT);
lp.setMargins(margin,
0, margin, 0);
mSurfaceView.setLayoutParams(lp);
}
else
{
// 横屏录制的视频,调节其左右的空余
int h
= mSurfaceViewWidth
*
height /
width;
int margin
=
(mSurfaceViewHeight - h)
/ 2;
Logger.d(TAG,
"margin:"
+ margin);
RelativeLayout.LayoutParams lp
=
new RelativeLayout.LayoutParams(
RelativeLayout.LayoutParams.MATCH_PARENT,
RelativeLayout.LayoutParams.MATCH_PARENT);
lp.setMargins(0,
margin, 0, margin);
mSurfaceView.setLayoutParams(lp);
}
}
这样不管横屏还是竖屏录制的视频都可以正常的显示了。当然我默认的都是横屏观看,如果在播放的时候要做横竖屏的切换也可以按照这个方法来。
相关文章推荐
- Android使用SurfaceView播放视频时横竖屏的调整
- Android SurfaceView播放视频时横竖屏的调整
- Android使用SurfaceView实现播放视频
- android下面使用SurfaceView+ mediaPlayer播放视频
- Android里面使用MediaPlayer通过SurfaceView播放视频的示例
- Android视频播放框架Vitamio集成及使用MediaPlayer+SurfaceView、VideoView+MediaController实现播放网络视频
- 从头学Android之多媒体--使用MediaPlayer和SurfaceView播放视频
- android中使用surfaceview进行视频播放
- Android之多媒体--使用MediaPlayer和SurfaceView播放视频
- Android 使用 MediaPlayer + SurfaceView 播放视频
- Android使用SurfaceView播放视频 简单介绍
- 从头学Android之多媒体--使用MediaPlayer和SurfaceView播放视频
- Android -- 视频音频多媒体播放,在线播放, MediaPlayer, SurfaceView, SoundPool, Timer定时器使用
- android中使用MediaPlayer和SurfaceView播放视频
- android--(surfaceView实现视频播放、9.path工具使用)
- Android中使用MediaPlayer类和SurfaceView播放视频
- Android使用VideoView和MediaController播放网络视频(包括横竖排切换的处理)
- 解决Android使用SurfaceView播放视频结束后黑屏问题
- Android之使用MediaPlayer和SurfaceView组件播放一个简单的视频
- Android:使用MediaPlayer和SurfaceView播放视频