web-dev-qa-db-de.com

Vollbild-Videoansicht ohne Dehnung des Videos

Ich frage mich, ob ich eine Möglichkeit bekomme, Video über die Videowiedergabe im Vollbildmodus laufen zu lassen.

Ich habe viel gesucht und viele Möglichkeiten ausprobiert, wie zum Beispiel:

  1. Thema im Manifest anwenden:

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

    dies erzwingt jedoch nicht, dass das Video im Vollbildmodus angezeigt wird.

  2. Bewerben Sie sich in der Aktivität selbst:

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

    erzwingt auch nicht, dass das Video im Vollbildmodus angezeigt wird.

Der einzige Weg, um das Video zum Vollbild zu zwingen, ist:

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

Auf diese Weise wird ein Vollbildvideo erstellt, das jedoch das Video selbst streckt (längliches Video),

Ich wende diese ungeeignete Lösung nicht auf meine Videoansicht an. Gibt es also eine Möglichkeit, dies zu tun, ohne das Video zu dehnen?

Videoklasse:

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

Auf diese Weise können Sie die Eigenschaften des Videos selbst festlegen.

Verwenden Sie eine Oberflächenansicht (gibt Ihnen mehr Kontrolle über die Ansicht) und setzen Sie sie auf fill_parent, um den gesamten Bildschirm abzugleichen

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

rufen Sie dann in Ihrem Java-Code die Oberflächenansicht auf und fügen Sie Ihren Media Player hinzu

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

stellen Sie auf Ihrem Mediaplayer einen onPreparedListener ein und berechnen Sie die gewünschte Größe des Videos manuell, um den Bildschirm im gewünschten Verhältnis auszufüllen und das Video nicht zu dehnen!

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();         
    }

        }
    });

Ich habe dies von einem Tutorial für das Video-Streaming geändert, das ich vor einiger Zeit verfolgt habe. Ich kann es jetzt nicht finden, um darauf zu verweisen.

Ich hoffe es hilft!

EDIT

Ok, wenn Sie möchten, dass das Video den gesamten Bildschirm einnimmt und Sie es nicht strecken möchten, werden am Ende schwarze Streifen an den Seiten angezeigt. Im Code, den ich gepostet habe, finden wir heraus, was größer ist, das Video oder den Bildschirm des Telefons und passen ihn so an, wie wir können. 

Dort hast du meine komplette Aktivität, ein Video von einem Link zu streamen. Es ist zu 100% funktionsfähig. Ich kann Ihnen nicht sagen, wie Sie ein Video von Ihrem eigenen Gerät abspielen, da ich das nicht weiß. Ich bin sicher, Sie finden es in der Dokumentation hier oder hier

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>

versuchen Sie dies, es funktioniert für mich

4
R KiranKumar

Die aktuell aktualisierte Lösung funktioniert, aber es gibt möglicherweise eine einfachere Lösung für das ursprüngliche Problem. Ein Kommentator hat zu Recht darauf hingewiesen, dass Sie die Größe eines VideoView-Objekts mit derselben Methode ändern können, ohne dass dafür Kosten in ein SurfaceView-Gerät umgewandelt werden müssten. Ich habe dies in einer meiner Apps getestet und es scheint zu funktionieren. Fügen Sie einfach die berechneten Layout-Parameter zum VideoView im OnPreparedListener-Callback hinzu:

mInspirationalVideoView.setOnPreparedListener (neuer MediaPlayer.OnPreparedListener () { @Override public void onPrepared (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

Nun, ich hoffe es hilft FullscreenVideoView

Es behandelt den gesamten langweiligen Code für die Oberflächenansicht und die Vollbildansicht und lässt Sie nur auf die Schaltflächen der Benutzeroberfläche fokussieren.

Sie können das FullscreenVideoLayout verwenden, wenn Sie keine benutzerdefinierten Schaltflächen erstellen möchten.

0
Hamiseixas

Ein SurfaceView gibt Ihnen eine optimierte Zeichenoberfläche

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

MediaPlayer-Aufrufe sollten in einen try {} eingeschlossen werden.

    @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

Hier ist meine Funktion, die für das Vollbildvideo funktioniert, ohne es zu dehnen. Die Seiten des Videos werden automatisch zugeschnitten. Es funktionierte sowohl im Hoch- als auch im Querformat.

Es wurde tatsächlich aus der Antwort genommen.

    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

Haben Sie versucht, die Größe des darunterliegenden Flächenhalters anzupassen? Versuchen Sie es mit dem Code darunter. Der Oberflächenhalter muss auf die gleiche Breite und Höhe der Bildschirmgröße eingestellt werden. Sie sollten Ihre Aktivität auch ohne Titelleiste als Vollbild anzeigen.

    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

Ich habe dieses Problem gelöst durch Custom VideoView :

Ich habe VideoView auf zwei Arten zu ParentView hinzugefügt. 

Fügen Sie die benutzerdefinierte Klasse für VideoView mit dem Namen FullScreenVideoView.Java hinzu: 

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

Wie binden mit 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>

ODER

/ Programmatisch hinzufügen VideoView zu ParentView :

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

Hoffe, das wird dir helfen.

0
Hiren Patel