2015-02-02 10 views
8

Ich habe 10 Videos, die ich spielen muss, sobald eine fertig ist, beginnt die nächste zu spielen.ExoPlayer - 10 Dateien hintereinander abspielen

Ich benutze Google's ExoPlayer, ich benutze das Beispiel in der DEMO @ GitHub. Ich kann 1 Video spielen, aber wenn ich versuche, den nächsten zu spielen, wird es nicht starten.

Wenn ich versuche, den Player erneut zu starten, und die Wiedergabe beginnt, stürzt es ab.

private void loadvideo() { 
    Uri uri = Uri.parse(VIDEO_LIBRARY_URL + currentVideo + ".mp4"); 
    sampleSource = new FrameworkSampleSource(this, uri, null, 2); 

    // 1. Instantiate the player. 
    // 2. Construct renderers. 
    videoRenderer = new MediaCodecVideoTrackRenderer(sampleSource, MediaCodec.VIDEO_SCALING_MODE_SCALE_TO_FIT_WITH_CROPPING); 
    audioRenderer = new MediaCodecAudioTrackRenderer(sampleSource); 
    // 3. Inject the renderers through prepare. 
    player.prepare(videoRenderer, audioRenderer); 
    // 4. Pass the surface to the video renderer. 
    surface = surfaceView.getHolder().getSurface(); 

    player.sendMessage(videoRenderer, MediaCodecVideoTrackRenderer.MSG_SET_SURFACE, surface); 
    // 5. Start playback. 
    player.setPlayWhenReady(true); 
    player.addListener(new ExoPlayer.Listener() { 
     @Override 
     public void onPlayerStateChanged(boolean playWhenReady, int playbackState) { 
      Log.d(TAG, "onPlayerStateChanged + " + playbackState); 
      if (playbackState == ExoPlayer.STATE_ENDED) { 
       currentVideo++; 
       loadNextVideo(); 
      } 
     } 

     @Override 
     public void onPlayWhenReadyCommitted() { 

     } 

     @Override 
     public void onPlayerError(ExoPlaybackException error) { 

     } 
    }); 

} 

Was mache ich falsch? Wie kann ich Videos Kontinuität spielen?

Danke.

+0

welchen Fehler Sie in Crash bekommen? –

+0

Wie sieht Ihr loadNextVideo() Code aus? –

Antwort

2

OK, beantworte meine eigene Frage. Im Beispiel, google init den ExoPlayer bei OnResume(). ich hatte für jedes Video wieder init wie folgt aus:

player = ExoPlayer.Factory.newInstance(2, 1000, 5000); 

, wenn jemand eine bessere Idee hat, lassen Sie es mich wissen.

+0

Das behebt das Problem nicht für mich :( – Markymark

+0

@ Marky17 Vor dem Instanziieren eines neuen Instanzaufrufs releasePlayer() -Methode. –

+0

@Shahar Hallo Ich versuche, ein einfaches Video-Player-Programm mit ExoPlayer erstellen, aber noch nicht fertig, habe ich überprüft Github-Repositories, aber habe dein ExoPlayer-Sample dort nicht gefunden ... bitte poste dein Beispiel und teile den Link mit mir ... damit ich davon lerne .. – Sophie

12

Sie können den ExoPlayer bis zu dem Punkt, an dem Sie release() aufrufen, wiederverwenden und dann nicht mehr verwenden.

Um die Medien zu ändern, dass es gerade abgespielt wird, müssen Sie im Wesentlichen die folgenden Schritte durchführen:

// ...enable autoplay... 
player.stop(); 
player.seekTo(0L); 
player.prepare(renderers); 

die Renderer zu schaffen, ist ein bisschen mehr beteiligt, aber das ist der Fluss Sie und der Spieler folgen sollte sollte in der Lage sein, Videos von hinten nach hinten abzuspielen.

+0

Ich hatte das gleiche Problem, und diese Lösung funktionierte für mich – mmark

+0

Es war nicht offensichtlich für mich überhaupt, dass Sie auf 0 suchen mussten, bevor Sie den Renderer wieder vorbereiten. Danke. –

4

Ich verwende Exoplayer Änderung mp4 Video Erfolg. Ich benutze das Beispiel in der DEMO. 1.DEMO Projekt in DemoPlayer.java:

private final RendererBuilder rendererBuilder; 
//remove final,then modify that: 

private RendererBuilder rendererBuilder; 

//and add the set method: 
public void setRendererBuilder(RendererBuilder rendererBuilder){ 
     this.rendererBuilder = rendererBuilder; 
    } 

//finally,add stop method 
public void stop(){ 
     player.stop(); 
    } 

2.DEMO Projekt in PlayerActivity.java: add-Methode:

private void changeVideo(){ 
     player.stop(); 
     player.seekTo(0L); 
     //you must change your contentUri before invoke getRendererBuilder(); 
     player.setRendererBuilder(getRendererBuilder()); 
     player.prepare(); 
     playerNeedsPrepare = false; 
    } 

Änderung param contentUri erinnern, bevor changeVideo Methode aufrufen.

+0

Das funktioniert für mich :) – Charlie

0

Es gibt eine andere Lösung, die Sie auf ConcatenatingMediaSource beziehen können, um automatisches Abspielen der nächsten Medien zu erreichen.

Im Demo-App Beispiel: 1. Starten Sie ExoPlayer 2. Wählen Sie Wiedergabelisten 3. Wählen Sie Katzen-> Hunde

Verwandte Themen