web-dev-qa-db-fra.com

Affichage vidéo plein écran sans étirer la vidéo

Je me demande si je peux obtenir un moyen de laisser la vidéo défiler par vidéo en plein écran?

J'ai beaucoup cherché et essayé plusieurs méthodes, telles que:

  1. Appliquer le thème dans le manifeste:

    Android:theme="@Android:style/Theme.NoTitleBar.Fullscreen"
    

    mais cela ne force pas la vidéo à être en plein écran.

  2. Appliquer dans l'activité elle-même: 

    requestWindowFeature(Window.FEATURE_NO_TITLE);  
    getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,  
        WindowManager.LayoutParams.FLAG_FULLSCREEN);
    

    ne force pas non plus la vidéo à être en plein écran.

La seule façon de forcer la vidéo en plein écran est la suivante:

<VideoView Android:id="@+id/myvideoview"
    Android:layout_width="fill_parent"
    Android:layout_alignParentRight="true"
    Android:layout_alignParentLeft="true" 
    Android:layout_alignParentTop="true" 
    Android:layout_alignParentBottom="true" 
    Android:layout_height="fill_parent"> 
</VideoView> 

De cette façon, il en résulte une vidéo plein écran mais il étend la vidéo elle-même (vidéo allongée),

Je n'applique pas cette solution inappropriée à ma vidéo, alors y a-t-il un moyen de le faire sans étirer la vidéo?

Classe vidéo:

public class Video extends Activity {
    private VideoView myvid;

    @Override
    public void onCreate(Bundle icicle) {
        super.onCreate(icicle);
        setContentView(R.layout.main);
        myvid = (VideoView) findViewById(R.id.myvideoview);
        myvid.setVideoURI(Uri.parse("Android.resource://" + getPackageName() 
            +"/"+R.raw.video_1));
        myvid.setMediaController(new MediaController(this));
        myvid.requestFocus();
        myvid.start();
    }
}

main.xml:

<LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:layout_width="fill_parent"
    Android:layout_height="fill_parent"
    Android:orientation="vertical" >

    <VideoView
        Android:id="@+id/myvideoview"
        Android:layout_width="fill_parent"
        Android:layout_height="fill_parent" />

</LinearLayout>
26
Android Stack

Ainsi, vous pouvez définir vous-même les propriétés de la vidéo.

Utilisez une SurfaceView (vous donne plus de contrôle sur la vue), définissez-la sur fill_parent pour qu'elle corresponde à tout l'écran.

<LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"     
              Android:orientation="vertical" 
              Android:layout_width="match_parent"
              Android:layout_height="fill_parent">

    <SurfaceView
        Android:id="@+id/surfaceViewFrame"
        Android:layout_width="fill_parent"
        Android:layout_height="fill_parent"
        Android:layout_gravity="center" >
    </SurfaceView>
</Linearlayout>

puis sur votre code Java obtenir la vue de surface et ajoutez votre lecteur multimédia à celui-ci

surfaceViewFrame = (SurfaceView) findViewById(R.id.surfaceViewFrame);
player = new MediaPlayer();
player.setDisplay(holder);

définissez sur votre lecteur multimédia un écouteur préparé et calculez manuellement la taille souhaitée de la vidéo pour remplir l'écran dans la proportion souhaitée en évitant d'étirer la vidéo!

player.setOnPreparedListener(new OnPreparedListener() {

        @Override
        public void onPrepared(MediaPlayer mp) {
                    // Adjust the size of the video
    // so it fits on the screen
    int videoWidth = player.getVideoWidth();
    int videoHeight = player.getVideoHeight();
    float videoProportion = (float) videoWidth / (float) videoHeight;       
    int screenWidth = getWindowManager().getDefaultDisplay().getWidth();
    int screenHeight = getWindowManager().getDefaultDisplay().getHeight();
    float screenProportion = (float) screenWidth / (float) screenHeight;
    Android.view.ViewGroup.LayoutParams lp = surfaceViewFrame.getLayoutParams();

    if (videoProportion > screenProportion) {
        lp.width = screenWidth;
        lp.height = (int) ((float) screenWidth / videoProportion);
    } else {
        lp.width = (int) (videoProportion * (float) screenHeight);
        lp.height = screenHeight;
    }
    surfaceViewFrame.setLayoutParams(lp);

    if (!player.isPlaying()) {
        player.start();         
    }

        }
    });

Je l'ai modifié à partir d'un tutoriel pour le streaming vidéo que j'ai suivi il y a quelque temps. Je ne le trouve pas pour le référencer. Si quelqu'un le fait, veuillez ajouter le lien à la réponse!

J'espère que ça aide!

MODIFIER

Ok, donc si vous voulez que la vidéo occupe tout l'écran et que vous ne vouliez pas l'étirer, vous allez vous retrouver avec des bandes noires sur les côtés. Dans le code que j'ai posté, nous découvrons ce qui est plus gros, la vidéo ou l'écran du téléphone, et nous y adaptons le mieux possible. 

Voilà mon activité complète, le streaming d'une vidéo à partir d'un lien. C'est 100% fonctionnel. Je ne peux pas vous dire comment lire une vidéo à partir de votre propre appareil car je ne le sais pas. Je suis sûr que vous le trouverez dans la documentation ici ou ici

public class VideoPlayer extends Activity implements Callback, OnPreparedListener, OnCompletionListener, 
    OnClickListener {   

private SurfaceView surfaceViewFrame;
private static final String TAG = "VideoPlayer";
private SurfaceHolder holder;
private ProgressBar progressBarWait;
private ImageView pause;
private MediaPlayer player; 
private Timer updateTimer;
String video_uri = "http://daily3gp.com/vids/familyguy_has_own_orbit.3gp";  


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.videosample);       


    pause = (ImageView) findViewById(R.id.imageViewPauseIndicator);
    pause.setVisibility(View.GONE);
    if (player != null) {
        if (!player.isPlaying()) {
            pause.setVisibility(View.VISIBLE);
        }
    }


    surfaceViewFrame = (SurfaceView) findViewById(R.id.surfaceViewFrame);
    surfaceViewFrame.setOnClickListener(this);
    surfaceViewFrame.setClickable(false);

    progressBarWait = (ProgressBar) findViewById(R.id.progressBarWait);

    holder = surfaceViewFrame.getHolder();
    holder.addCallback(this);
    holder.setType(SurfaceHolder.SURFACE_TYPE_Push_BUFFERS);

    player = new MediaPlayer();
    player.setOnPreparedListener(this);
    player.setOnCompletionListener(this);
    player.setScreenOnWhilePlaying(true);
    player.setDisplay(holder);
}

private void playVideo() {
        new Thread(new Runnable() {
            public void run() {
                try {
                    player.setDataSource(video_uri);
                    player.prepare();
                } catch (Exception e) { // I can split the exceptions to get which error i need.
                    showToast("Error while playing video");
                    Log.i(TAG, "Error");
                    e.printStackTrace();
                } 
            }
        }).start();     
}

private void showToast(final String string) {
    runOnUiThread(new Runnable() {
        public void run() {
            Toast.makeText(VideoPlayer.this, string, Toast.LENGTH_LONG).show();
            finish();
        }
    });
}


public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
    // TODO Auto-generated method stub

}

public void surfaceCreated(SurfaceHolder holder) {
    playVideo();
}

public void surfaceDestroyed(SurfaceHolder holder) {
    // TODO Auto-generated method stub

}
//prepare the video
public void onPrepared(MediaPlayer mp) {        
    progressBarWait.setVisibility(View.GONE);

    // Adjust the size of the video
    // so it fits on the screen
    int videoWidth = player.getVideoWidth();
    int videoHeight = player.getVideoHeight();
    float videoProportion = (float) videoWidth / (float) videoHeight;       
    int screenWidth = getWindowManager().getDefaultDisplay().getWidth();
    int screenHeight = getWindowManager().getDefaultDisplay().getHeight();
    float screenProportion = (float) screenWidth / (float) screenHeight;
    Android.view.ViewGroup.LayoutParams lp = surfaceViewFrame.getLayoutParams();

    if (videoProportion > screenProportion) {
        lp.width = screenWidth;
        lp.height = (int) ((float) screenWidth / videoProportion);
    } else {
        lp.width = (int) (videoProportion * (float) screenHeight);
        lp.height = screenHeight;
    }
    surfaceViewFrame.setLayoutParams(lp);

    if (!player.isPlaying()) {
        player.start();         
    }
    surfaceViewFrame.setClickable(true);
}

// callback when the video is over
public void onCompletion(MediaPlayer mp) {
    mp.stop();
    if (updateTimer != null) {
        updateTimer.cancel();
    }
    finish();
}

//pause and resume
public void onClick(View v) {
    if (v.getId() == R.id.surfaceViewFrame) {
         if (player != null) {
            if (player.isPlaying()) {
                player.pause();
                pause.setVisibility(View.VISIBLE);
            } else {
                player.start();
                pause.setVisibility(View.GONE);
            }
        }
    }
}

}
41
caiocpricci2
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        videoView1 = (VideoView) findViewById(R.id.videoview);
                String SrcPath = "/mnt/sdcard/final.mp4";
        videoView1.setVideoPath(SrcPath);
        videoView1.setMediaController(new MediaController(this));
        videoView1.requestFocus();      
        videoView1.start();     
    }
}




<VideoView
    Android:id="@+id/videoview"
    Android:layout_width="fill_parent"
    Android:layout_height="fill_parent"
    Android:layout_alignParentBottom="true"
    Android:layout_alignParentLeft="true"
    Android:layout_alignParentRight="true"
    Android:layout_alignParentTop="true" >
</VideoView>

essayez ça marche pour moi

4
R KiranKumar

La solution actuelle votée vers le haut fonctionne, mais il peut y avoir une solution plus simple au problème initial. Un intervenant a souligné à juste titre que vous pouvez redimensionner un VideoView en utilisant la même méthodologie sans le coût de la conversion totale en SurfaceView. J'ai testé cela dans l'une de mes applications et cela semble fonctionner. Ajoutez simplement les paramètres de mise en page calculés à VideoView dans le rappel OnPreparedListener:

mInspirationalVideoView.setOnPreparedListener (nouveau MediaPlayer.OnPreparedListener () { @Override public void onPrepar (MediaPlayer mp) { // mMediaPlayer = mp;

            mp.setOnSeekCompleteListener(new MediaPlayer.OnSeekCompleteListener() {
                @Override
                public void onSeekComplete(MediaPlayer mp) {
                    if(isPlaying = true) {
                        stopPosition = 0;
                        mp.start();
                        mVideoProgressTask = new VideoProgress();
                        mVideoProgressTask.execute();
                    }
                }
            });


            // so it fits on the screen
            int videoWidth = mp.getVideoWidth();
            int videoHeight = mp.getVideoHeight();
            float videoProportion = (float) videoWidth / (float) videoHeight;
            int screenWidth = getWindowManager().getDefaultDisplay().getWidth();
            int screenHeight = getWindowManager().getDefaultDisplay().getHeight();

            float screenProportion = (float) screenWidth / (float) screenHeight;
            Android.view.ViewGroup.LayoutParams lp = mInspirationalVideoView.getLayoutParams();

            if (videoProportion > screenProportion) {
                lp.width = screenWidth;
                lp.height = (int) ((float) screenWidth / videoProportion);
            } else {
                lp.width = (int) (videoProportion * (float) screenHeight);
                lp.height = screenHeight;
            }

            mInspirationalVideoView.setLayoutParams(lp);

           ...

        }
    });
2
Clay Martin

Eh bien, j'espère que cela aide FullscreenVideoView

Il gère tout le code ennuyeux concernant SurfaceView et le mode plein écran et vous permet de vous concentrer uniquement sur les boutons de l'interface utilisateur.

Et vous pouvez utiliser FullscreenVideoLayout si vous ne voulez pas créer vos boutons personnalisés.

0
Hamiseixas

Un SurfaceView vous donne une surface de dessin optimisée

public class YourMovieActivity extends Activity implements SurfaceHolder.Callback {
        private MediaPlayer media = null;
        //...

        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);

            media = new MediaPlayer();
            mSurfaceView = (SurfaceView) findViewById(R.id.surface);
            //...
        }
    }

Les appels MediaPlayer doivent être encapsulés dans un essai {}.

    @Override
    public void surfaceCreated(SurfaceHolder holder) {

        media.setDataSource("Android.resource://" + getPackageName() 
            +"/"+R.raw.video_);
        media.prepare();

            int videoWidth = mp.getVideoWidth();
        int videoHeight = mp.getVideoHeight();

            int screenWidth = getWindowManager().getDefaultDisplay().getWidth();

            Android.view.

ViewGroup.LayoutParams layout = mSurfaceView.getLayoutParams();

    layout.width = screenWidth;

    layout.height = (int) (((float)videoHeight / (float)videoWidth) * (float)screenWidth);

    mSurfaceView.setLayoutParams(layout);        

    mp.start();
}
0
Terril Thomas

Voici ma fonction qui fonctionne pour la vidéo en plein écran sans l'étirer. Il rognera automatiquement les côtés de la vidéo. Cela fonctionnait aussi bien en mode portrait qu'en mode paysage.

Il a en fait été tiré de répondre .

    public void onPrepared(MediaPlayer mp) {
        int videoWidth = mediaPlayer.getVideoWidth();
        int videoHeight = mediaPlayer.getVideoHeight();

        DisplayMetrics displayMetrics = new DisplayMetrics();
        getWindowManager().getDefaultDisplay().getMetrics(displayMetrics);
        int screenWidth = displayMetrics.widthPixels;
        int screenHeight = displayMetrics.heightPixels;

        float scaleY = 1.0f;
        float scaleX = (videoWidth * screenHeight / videoHeight) / screenWidth;

        int pivotPointX = (int) (screenWidth / 2);
        int pivotPointY = (int) (screenHeight / 2);

        surfaceView.setScaleX(scaleX);
        surfaceView.setScaleY(scaleY);
        surfaceView.setPivotX(pivotPointX);
        surfaceView.setPivotY(pivotPointY);

        mediaPlayer.setLooping(true);
        mediaPlayer.start();
    }
0
Hari Krishnan

Avez-vous essayé d'ajuster la taille du support de surface sous-jacente? Essayez le code ci-dessous il devrait ajuster le support de surface pour avoir la même largeur et hauteur de la taille de l'écran. Votre activité devrait toujours être en plein écran sans barre de titre.

    public class Video extends Activity {
        private VideoView myvid;

        @Override
        public void onCreate(Bundle icicle) {
            super.onCreate(icicle);
            setContentView(R.layout.main);
            myvid = (VideoView) findViewById(R.id.myvideoview);
            myvid.setVideoURI(Uri.parse("Android.resource://" + getPackageName() 
                +"/"+R.raw.video_1));
            myvid.setMediaController(new MediaController(this));
            myvid.requestFocus();

            //Set the surface holder height to the screen dimensions
            Display display = getWindowManager().getDefaultDisplay();
            Point size = new Point();
            display.getSize(size);
            myvid.getHolder().setFixedSize(size.x, size.y);

            myvid.start();
        }
    }
0
Bobbake4

J'ai résolu ce problème par Custom VideoView :

J'ai ajouté VideoView à ParentView de deux manières. Du xml au programme. 

Ajouter une classe personnalisée pour VideoView nommée avec FullScreenVideoView.Java

import Android.content.Context;
import Android.util.AttributeSet;
import Android.widget.VideoView;

public class FullScreenVideoView extends VideoView {
    public FullScreenVideoView(Context context) {
        super(context);
    }

    public FullScreenVideoView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public FullScreenVideoView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec){
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
        setMeasuredDimension(widthMeasureSpec, heightMeasureSpec);
    }
}

Comment lier avec xml :

<FrameLayout
   Android:id="@+id/secondMedia"
   Android:layout_width="match_parent"
   Android:layout_height="match_parent">

     <com.my.package.customview.FullScreenVideoView
           Android:layout_width="match_parent"
           Android:layout_height="match_parent" 
           Android:id="@+id/fullScreenVideoView"/>

</FrameLayout>

OU

Comment ajouter par programme VideoView à ParentView :

FullScreenVideoView videoView = new FullScreenVideoView(getActivity());
parentLayout.addView(videoView, new FrameLayout.LayoutParams(FrameLayout.LayoutParams.MATCH_PARENT, FrameLayout.LayoutParams.MATCH_PARENT));

J'espère que ceci vous aidera.

0
Hiren Patel