it-swarm.com.de

Android VideoView schwarzer Bildschirm

Ich habe nach einer Möglichkeit gesucht, den unangenehmen schwarzen Startbildschirm auf einem VideoView zu entfernen, bevor die start () - Methode ausgeführt wird.

Ich habe es mit einem Hintergrundbild auf dem Widget versucht, aber es funktioniert nicht wie erwartet ... Ich habe auch versucht, ein Bild des ersten Frames in das Video auf die VideoView zu setzen und es nach der stars () -Methode zu verstecken. Hinzufügen eines onPrepared-Listeners zum Starten des Videos und Ausblenden des Bildes. Das funktioniert, aber der Übergang ist furchtbar flackernd und ich weiß nicht, wie ich ihn loswerden kann.


Danke für deine Antwort. Das Hinzufügen des MediaControllers hatte keinerlei Auswirkungen. Das Problem bleibt bestehen (ich sehe immer noch das schwarze Flimmern) und ich möchte, dass die Videosteuerelemente überhaupt nicht sichtbar sind. Mein Code sieht folgendermaßen aus: 

    VideoView vSurface= (VideoView) findViewById(R.id.surfaceView1);
    vSurface.setVideoURI(Uri.parse("Android.resource://com.mypackage/" + R.raw.video1));
    vSurface.setVisibility(View.VISIBLE);
    vSurface.setOnPreparedListener(this);
    vSurface.setDrawingCacheEnabled(true);
    vSurface.setOnErrorListener(this);
48
SergioM

Ich habe das gleiche Problem und habe eine Lösung gefunden. Es ist ein bisschen hackig, aber es macht den Trick ... Sie müssen also grundsätzlich Ihr VideoView in ein FrameLayout einfügen. Über den Videoview müssen Sie ein weiteres FrameLayout mit dem Hintergrund Ihres Videos hinzufügen und wenn Ihr Video geladen ist und bereit zu spielen verstecken Sie den Platzhalter.

<FrameLayout
  Android:id="@+id/frameLayout1"
  Android:layout_width="fill_parent"
  Android:layout_height="fill_parent"
  Android:layout_gravity="center"
  Android:layout_marginTop="50dip" >

  <VideoView
    Android:id="@+id/geoloc_anim"
    Android:layout_width="fill_parent"
    Android:layout_height="172dip" Android:layout_gravity="top|center" Android:visibility="visible"/>

  <FrameLayout
      Android:id="@+id/placeholder"
      Android:layout_width="fill_parent"
      Android:layout_height="fill_parent" Android:background="@drawable/fondvert_anim">
  </FrameLayout>

In Ihrer Aktivität müssen Sie OnPreparedListener implementieren und diesen hinzufügen

//Called when the video is ready to play
public void onPrepared(MediaPlayer mp) {

    View placeholder = (View) findViewById(R.id.placeholder);

    placeholder.setVisibility(View.GONE);
}

Wenn das Video fertig ist, verstecken wir unseren Platzhalter und vermeiden diesen schwarzen Flimmern.

Hoffe das hilft jemandem.

35
M to the K

Ich treffe das gleiche Problem und löse es mit der oben akzeptierten Lösung plus:

  @Override
  public void onPrepared(MediaPlayer mp) {
    mp.setOnInfoListener(new MediaPlayer.OnInfoListener() {
      @Override
      public boolean onInfo(MediaPlayer mp, int what, int extra) {
        Log.d(TAG, "onInfo, what = " + what);
        if (what == MediaPlayer.MEDIA_INFO_VIDEO_RENDERING_START) {
          // video started; hide the placeholder.
          placeholder.setVisibility(View.GONE);
          return true;
        }
        return false;
      }
    });

Ich denke, onPrepared bedeutet nur, dass das Video abspielbereit ist, nicht jedoch, dass Video abgespielt wurde. Wenn Sie den Platzhalter in onPrepared ausblenden, wird auf dem Bildschirm immer noch ein schwarzer Bildschirm angezeigt.

Bei meinem Note3 und Nexus funktioniert diese Lösung gut.

45
wizardlee

Ich hatte das gleiche Problem auf Galaxy Tab 2, Android 4.1.1.

videoView.setZOrderOnTop(true); und nächste videoView.start()

Es funktioniert gut für mich.

38
jc_35

Ich hatte dasselbe Problem und das hat für mich funktioniert .. 

Wenn Sie ein Video anzeigen möchten, machen Sie videoView.setZOrderOnTop (false); und wenn Sie ein Video ausblenden möchten, machen Sie einfach videoView.setZOrderOnTop (true);

25
Ravi Bhojani

Ich habe das gleiche Problem, das ich gerade verwendet habe: videov.setBackgroundColor (Color.WHITE) und dann onprepare, wenn ich Color.TRANSPARENT verwendete

20

Durch das Erweitern einer TextureView erhalte ich am Anfang oder am Ende keine schwarzen Bildschirme. Dies ist, wenn Sie die Verwendung von ZOrderOnTop(true) vermeiden möchten.

public class MyVideoView extends TextureView implements TextureView.SurfaceTextureListener {
  private MediaPlayer mMediaPlayer;
  private Uri mSource;
  private MediaPlayer.OnCompletionListener mCompletionListener;
  private boolean isLooping = false;


  public MyVideoView(Context context) {
      this(context, null, 0);
  }

  public MyVideoView(Context context, AttributeSet attrs) {
      this(context, attrs, 0);
  }

  public MyVideoView(Context context, AttributeSet attrs, int defStyle) {
      super(context, attrs, defStyle);
      setSurfaceTextureListener(this);
  }

  public void setSource(Uri source) {
      mSource = source;
  }

  public void setOnCompletionListener(MediaPlayer.OnCompletionListener listener) {
      mCompletionListener = listener;
  }

  public void setLooping(boolean looping) {
     isLooping = looping;
  }

  @Override
  protected void onDetachedFromWindow() {
     // release resources on detach
     if (mMediaPlayer != null) {
         mMediaPlayer.release();
         mMediaPlayer = null;
     }
     super.onDetachedFromWindow();
   }

   /*
    * TextureView.SurfaceTextureListener
    */
    @Override
   public void onSurfaceTextureAvailable(SurfaceTexture surfaceTexture, int width, int height) {
     Surface surface = new Surface(surfaceTexture);
     try {
         mMediaPlayer = new MediaPlayer();
         mMediaPlayer.setOnCompletionListener(mCompletionListener);
         mMediaPlayer.setOnBufferingUpdateListener(this);
         mMediaPlayer.setOnErrorListener(this);
         mMediaPlayer.setLooping(isLooping);
         mMediaPlayer.setDataSource(getContext(), mSource);
         mMediaPlayer.setSurface(surface);
         mMediaPlayer.prepare();
         mMediaPlayer.start();
     } catch (IllegalArgumentException e) {
         e.printStackTrace();
     } catch (SecurityException e) {
         e.printStackTrace();
     } catch (IllegalStateException e) {
         e.printStackTrace();
         mMediaPlayer.reset();
     } catch (IOException e) {
         e.printStackTrace();
     }
   }

   @Override
   public void onSurfaceTextureSizeChanged(SurfaceTexture surface, int width, int height) {}

  @Override
  public boolean onSurfaceTextureDestroyed(SurfaceTexture surface) {
     surface.release();
     return true;
  }

  @Override
  public void onSurfaceTextureUpdated(SurfaceTexture surface) {}
}
15
Carl B

Das hat für mich funktioniert:

videoView.setBackgroundColor(Color.WHITE); // Your color.
videoView.start();
videoView.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
    @Override
    public void onPrepared(MediaPlayer mp) {
        videoView.setBackgroundColor(Color.TRANSPARENT);
    }
});

Mindestens zwei Jahre später, aber ich hoffe, das war hilfreich.

7
emmgfx

Dies ist definitiv hackig, aber besser als das Überlagern eines Bildes (IMO).

boolean mRestored = false;

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

    mRestored = savedInstanceState != null;
}

@Override
public void onPrepared(MediaPlayer mp) {

    if (!mRestored) vSurface.seekTo(1);
}

Angenommen, Sie setzen Dinge in savedInstanceState in onSaveInstanceState.

4
Paul Burke

Keiner der oben genannten hat für mich gearbeitet. In meinem Fall wird onPrepared aufgerufen, BEVOR der schwarze Rahmen verschwunden ist, sodass ich den schwarzen Rahmen immer noch sehen würde.

Ich brauchte eine Lösung, bei der das Video kurz nach dem ersten Bild erschien.

Also habe ich VideoView Alpha in xml auf 0 gesetzt:

Android:alpha="0"

und bevor ich das Video starte, animiere ich das Alpha wieder auf 1:

videoView.animate().alpha(1);
videoView.seekTo(0);
videoView.start();

alternativ können Sie ein verzögertes Runable bereitstellen, um das Alpha auf 1 zu setzen, anstatt es zu animieren. 

3
Siavash

Für Leute, die immer noch nach einer Antwort suchen, funktionierte der Aufruf von VideoView.start() und VideoView.pause() in onPrepared für mich. Ich weiß, dass dies möglicherweise nicht der ideale Weg ist, um dies zu erreichen, jedoch ist dies möglicherweise die, bei der im Code ein Minimum an Workaround erforderlich ist. Ich hoffe, das funktioniert auch für Sie.

@Override
public void onPrepared(MediaPlayer mp) {
    mVideoView.start();
    mVideoView.pause();
}
2
Gagan

Verwenden Sie einfach VideoView # setBackgroundDrawable (), denke ich.

  1. grundeinstellungen.

    VideoView.setBackgroundDrawable(yourdrawableid);
    
  2. video starten

    VideoView.start();
    VideoView.setBackgroundDrawable(0);
    
2
Takeaki Kubota

Zeigen Sie einfach ein Bild aus dem Video als Vorschau an.

vSurface.SeekTo(100);
2
j7nn7k

Es funktioniert sowohl für Activity als auch für Fragment.

VideoView mVideo = (VideoView) findViewById(R.id.yourViewViewId);
          mVideo.setVideoURI(mUri);
          mVideo.setZOrderOnTop(false);

SurfaceHolder surfaceholder = mVideo.getHolder();
surfaceholder.setFormat(PixelFormat.TRANSPARENT);
1
Nam lê đình

Dieser arbeitet für mich: 

In XML: VideoView verstecken sich hinter einem relativen Layout mit weißem Hintergrund

    <VideoView
      Android:id="@+id/myVideo"
      Android:layout_below="@+id/logo_top"
      Android:layout_width="200dp"
      Android:layout_height="200dp"
      Android:layout_centerHorizontal="true" 
    />
    <RelativeLayout
      Android:id="@+id/mask"
      Android:background="#FFFFFF"
      Android:layout_below="@+id/logo_top"
      Android:layout_centerHorizontal="true"
      Android:layout_width="200dp"  Android:layout_height="200dp"
    >
    </RelativeLayout>

und in Activity: onCreate

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.acceuil);
    myVideo = (VideoView)  findViewById(R.id.myVideo);
    mask = (RelativeLayout)  findViewById(R.id.mask);
    String path = "Android.resource://" 
      + getPackageName() + "/" + R.raw.anim_normal;
    myVideo.setVideoURI(Uri.parse(path));
    myVideo.start();
}

am Start : 

 public void onStart() { 
    final long time = System.currentTimeMillis();
    super.onStart();
    new CountDownTimer(5000, 100) { 
    @Override
        public void onTick(long l) {

            long time2 = System.currentTimeMillis();
            if((time2 - time) > 500) {
                mask.setVisibility(View.GONE);
            }
        }

}.start();

Hoffe das hilft.

1
Ramza

Ich hatte das gleiche Problem. Ich fand heraus, dass der Hauptgrund dafür die Verwendung von FrameLayout als übergeordnetes Layout war. Verwenden Sie RelativeLayout als übergeordnetes Layout der VideoView.

0
Vinil Chandran

Das Ändern der Antwort von @ emmgfx hat bei mir funktioniert:

videoView.setBackgroundColor(Color.WHITE)
videoView.start()
Timer().schedule(100){
  videoView?.setBackgroundColor(Color.TRANSPARENT)
}

Der Trick ist, die Videoansicht zu verzögern, bis das Video geladen ist. PS: Es ist Kotlin.

0
Fawaz

Ich würde diese Lösung vorziehen: https://stackoverflow.com/a/11016465/2267723

es ist ungefähr über der Oberfläche, also erstellen Sie ein [email protected], und Sie werden diesen schwarzen Blitz nicht mehr sehen. 

0
Maher Abuthraa

Verwenden Sie svVideoView.seekTo (position)

Position innerhalb von 5 (ms) angeben.

onPause():
position=svVideoView.getCurrentPosition()

onResume():
svVideoView.seekTo(position);
0
Raj

Es ist ein bisschen spät für diese Antwort, aber möglicherweise haben andere Benutzer das gleiche Problem und finden diese Frage .. 

Ich habe mich damit befasst, indem ich zunächst eine BackgroundResource gesetzt habe und dann beim Starten des Videos den Hintergrund auf eine unsichtbare Farbe gesetzt habe.

VideoView myView = findViewById(R.id.my_view);
myView.setBackgroundResource(R.drawable.some_resource);
// some stuff

// this is when starting the video
myView.setVideoUri(someUri);
// also set MediaController somewhere...
//...
// now set the backgroundcolor to be not visible (first val of Color.argb(..) is the alpha)
myView.setBackGroundColor(Color.argb(0, 0, 0, 0));
//...
myView.start();
0
MalaKa

Um lästige flimmernde und schwarze Bildschirmprobleme zu vermeiden, habe ich FrameVideoView geschrieben. 

Es profitiert von 'Platzhalterlösung' und (wenn auf Ihrem Gerät API-Level 14 oder höher ausgeführt wird) von TextureView, was wesentlich effizienter ist als VideoView

Ich habe article in unserem Blog geschrieben, um darüber zu berichten, was es tatsächlich tut. 

Es ist einfach zu benutzen:

Fügen Sie FrameVideoView zum Layout hinzu:

<mateuszklimek.framevideoview.FrameVideoView
    Android:id="@+id/frame_video_view"
    Android:layout_width="@dimen/video_width"
    Android:layout_height="@dimen/video_height"
  />

finde seine Instanz in Activity und rufe entsprechende Methoden in onResume und onPause auf:

public class SampleActivity extends Activity {

  private FrameVideoView videoView;

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

    String uriString = "Android.resource://" + getPackageName() + "/" + R.raw.movie;
    videoView = (FrameVideoView) findViewById(R.id.frame_video_view);
    videoView.setup(Uri.parse(uriString), Color.GREEN);
  }

    @Override
    protected void onResume() {
      super.onResume();
      videoView.onResume();
    }

    @Override
    protected void onPause() {
      videoView.onPause();
      super.onPause();
    }
  }
0
klimat

Dies ist eine schöne Lösung:

package com.example.videoviewpractice;

import Android.app.Activity;
import Android.net.Uri;
import Android.os.Bundle;
import Android.view.View;
import Android.widget.MediaController;
import Android.widget.VideoView;

public class MainActivity extends Activity {

    VideoView myVideoView;

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

private void initVideo() {
    myVideoView = (VideoView) findViewById(R.id.videoView1);
    String url = "http://mtc.cdn.Vine.co/r/videos/3DF00EB7001110633055418310656_1e50d6d9a65.3.2.mp4?" + 
            "versionId=KVMUFFGqe6rYRrGKgl8hxL6eakVAErPy";
    myVideoView.setVideoURI(Uri.parse(url));
    myVideoView.setMediaController(new MediaController(this));
    myVideoView.requestFocus();
}

public void gone(View v){
    myVideoView.setZOrderOnTop(true);
    View placeholder = (View) findViewById(R.id.placeholder);

    placeholder.setVisibility(View.GONE);
    myVideoView.start();
}

}

activity_main.xml:

<LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
xmlns:tools="http://schemas.Android.com/tools"
Android:id="@+id/LinearLayout1"
Android:layout_width="match_parent"
Android:layout_height="match_parent"
Android:orientation="vertical"
tools:context="${relativePackage}.${activityClass}" >

<FrameLayout
    Android:id="@+id/frameLayout1"
    Android:layout_width="fill_parent"
    Android:layout_height="fill_parent"
    Android:layout_gravity="center"
    Android:layout_marginTop="50dip" >

    <VideoView
        Android:id="@+id/videoView1"
        Android:layout_width="300dp"
        Android:layout_height="300dp"
        Android:layout_gravity="top|center"
        Android:visibility="visible" />

    <FrameLayout
        Android:id="@+id/placeholder"
        Android:layout_width="300dp"
        Android:layout_height="300dp"
        Android:layout_gravity="top|center"
        Android:background="@drawable/ic_launcher"
        Android:onClick="gone" >
    </FrameLayout>

</FrameLayout>

</LinearLayout>
0
OShiffer