gpt4 book ai didi

Android:Mediaplayer:如何使用 SurfaceView 或 mediaplayer 以正确大小播放视频

转载 作者:IT王子 更新时间:2023-10-28 23:27:03 28 4
gpt4 key购买 nike

我正在使用 MediaPlayer 和 SurfaceView 播放本地视频文件。 SurfaceView 是 Activity 中的唯一控件,而我的视频文件是 QVGA 或其他。问题是视频被拉伸(stretch)了,我怎样才能以原始大小播放视频,例如qvga,剩余区域为黑色。

从迭代中,

当我在 XML 中强制设置 Surfaceview 的 layout_height/width 时,视频显示正常。surface_holder.setFixedSize(w,h) 没有效果,mp.setdisplay() 也没有。

请在此指导。

更新

XML 文件

<?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 的使用方法见以下链接

http://davanum.wordpress.com/2007/12/29/android-videomusic-player-sample-from-local-disk-as-well-as-remote-urls/

提前致谢。

最佳答案

将 SurfaceView 布局设置为 wrap_content 将不会调整视频大小以以适当的纵横比播放。

  • SurfaceView 是优化的绘图表面
  • 视频被绘制到 SurfaceView,而不包含在其中

wrap_content 与 SurfaceView 的 fill_parent 同义。

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

一些基本的初始化

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);
//...
}
}

然后是好东西。我在这里省略了错误检查以减少代码,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();
}

请注意,此代码对您的视频尺寸做了一些假设。照原样,它最大化宽度并假设高度不大于屏幕的高度。

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

关于Android:Mediaplayer:如何使用 SurfaceView 或 mediaplayer 以正确大小播放视频,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4835060/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com