MediaPlayerとSurfaceViewを使用してローカルビデオファイルを再生しています。 SurfaceViewはアクティビティの唯一のコントロールですが、ビデオファイルはQVGAなどです。問題は、ビデオが伸びていることです。元のサイズでビデオを再生するにはどうすればよいですか。残りの領域が黒のqvga。
繰り返しから、
XMLでSurfaceviewのlayout_height/widthを強制的に設定すると、ビデオが正常に表示されました。 surface_holder.setFixedSize(w,h)
は効果がなく、mp.setdisplay()も効果がありません。
これで案内してください。
[〜#〜] update [〜#〜]
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の使用方法は、次のリンクに従ってください
前もって感謝します。
SurfaceViewレイアウトをwrap_contentに設定すると、適切なアスペクト比で再生されるようにビデオのサイズがnotになります。
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より大きくないことを確認できます。
プロジェクトで現在使用しているコードは次のとおりです。
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>