web-dev-qa-db-ja.com

Android:Mediaplayer:SurfaceViewまたはmediaplayerを使用してビデオを正しいサイズで再生する方法

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の使用方法は、次のリンクに従ってください

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

前もって感謝します。

19
JRC

SurfaceViewレイアウトをwrap_contentに設定すると、適切なアスペクト比で再生されるようにビデオのサイズがnotになります。

  • 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より大きくないことを確認できます。

79
Error 454

プロジェクトで現在使用しているコードは次のとおりです。

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>
4
sherpya