Android:Mediaplayer:如何使用SurfaceView或者mediaplayer播放正确大小的video

我正在使用MediaPlayer和SurfaceView播放本地video文件。 SurfaceView是活动中的唯一控件,而我的video文件是QVGA或其他。 问题是,video越来越伸展,我如何播放video的原始大小,如QVGA剩余区域黑色。

从迭代开始,

当我在XML中强制设置SurfaceView的layout_height / width时,video显示正常。 surface_holder.setFixedSize(w,h)不起作用,既不是mp.setdisplay()。

请在这里指导。

UPDATE

XML flie

 <?xml version="1.0" encoding="utf-8"?> <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/home_container" android:layout_width="fill_parent" android:layout_height="fill_parent"> <SurfaceView android:id="@+id/surface" android:layout_width="fill_parent" android:layout_height="wrap_content" android:paddingTop="10dip" /> </framelayout> 

MediaPlayer使用情况如下

Android – Video/Music player sample (from local disk as well as remote URL’s)

提前致谢。

Solutions Collecting From Web of "Android:Mediaplayer:如何使用SurfaceView或者mediaplayer播放正确大小的video"

在你的SurfaceView在XML中使用wrap_content? 这应该解决你的问题,如果没有。 如果这不能解决您的问题,您可能需要粘贴更多的代码以供进一步调查。

将表面视图宽度也更改为wrap_content。

将SurfaceView布局设置为wrap_content 不会调整video的大小,以适当的宽高比进行播放。

  • SurfaceView是一个优化的绘图表面
  • 一个video被绘制到一个SurfaceView,不包含在其中

wrap_content与SurfaceView的fill_parent同义。

你想要做的是从MediaPlayer对象获取video的尺寸。 然后,您可以设置SurfaceView的纵横比来匹配video。

一些基本的初始化

 public class YourMovieActivity extends Activity implements SurfaceHolder.Callback { private MediaPlayer mp = null; //... @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); mp = new MediaPlayer(); mSurfaceView = (SurfaceView) findViewById(R.id.surface); //... } } 

那好东西 我在这里省略了错误检查以减less代码,MediaPlayer调用应该包装在一个try {}中。

 @Override public void surfaceCreated(SurfaceHolder holder) { mp.setDataSource("/sdcard/someVideo.mp4"); mp.prepare(); //Get the dimensions of the video int videoWidth = mp.getVideoWidth(); int videoHeight = mp.getVideoHeight(); //Get the width of the screen int screenWidth = getWindowManager().getDefaultDisplay().getWidth(); //Get the SurfaceView layout parameters android.view.ViewGroup.LayoutParams lp = mSurfaceView.getLayoutParams(); //Set the width of the SurfaceView to the width of the screen lp.width = screenWidth; //Set the height of the SurfaceView to match the aspect ratio of the video //be sure to cast these as floats otherwise the calculation will likely be 0 lp.height = (int) (((float)videoHeight / (float)videoWidth) * (float)screenWidth); //Commit the layout parameters mSurfaceView.setLayoutParams(lp); //Start video mp.start(); } 

请注意,这段代码对video的尺寸做了一些假设。 按原样,它将宽度最大化,并假定高度不大于屏幕的高度。

你可能想要适应高度而不是宽度,也可以检查尺寸计算,并确保它不大于屏幕或屏幕 – other_layout_elements。

这里是我目前在一个项目中使用的代码:

 private MediaPlayer mMediaPlayer; private SurfaceView mSurfaceView; private SurfaceHolder holder; private int mPos = 0; 

 int width = mSurfaceView.getWidth(); int height = mSurfaceView.getHeight(); float boxWidth = width; float boxHeight = height; float videoWidth = mMediaPlayer.getVideoWidth(); float videoHeight = mMediaPlayer.getVideoHeight(); Log.i(TAG, String.format("startVideoPlayback @ %d - video %dx%d - box %dx%d", mPos, (int) videoWidth, (int) videoHeight, width, height)); float wr = boxWidth / videoWidth; float hr = boxHeight / videoHeight; float ar = videoWidth / videoHeight; if (wr > hr) width = (int) (boxHeight * ar); else height = (int) (boxWidth / ar); Log.i(TAG, String.format("Scaled to %dx%d", width, height)); holder.setFixedSize(width, height); mMediaPlayer.seekTo(mPos); mMediaPlayer.start(); 

我正在使用的布局(您可以忽略进度条)

 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:gravity="center" android:orientation="vertical" > <ProgressBar android:id="@+id/progressBar1" style="?android:attr/progressBarStyleHorizontal" android:layout_width="match_parent" android:layout_height="wrap_content" /> <SurfaceView android:id="@+id/surface" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" > </SurfaceView>