2017-02-15 3 views
0

Ich versuche, MP3-Dateien mit ExoPlayer 2 zu streamen. Es dauert jedoch zu lange anfängliche laden. Aber manchmal beginnt es in 1-2 Sekunden, die gleiche Datei zu spielen, aber manchmal kann es für 10-20 Sekunden stecken bleiben. Vielleicht mache ich falsche Initialisierung für das Streaming? Hier ist meine Audioplayer Klasse:Android: ExoPlayer - stream mp3

class AudioPlayer { 

private static final DefaultBandwidthMeter BANDWIDTH_METER = new DefaultBandwidthMeter(); 
private Context mContext; 
private SimpleExoPlayer mPlayer; 
private String extraData; 
private int state; 
private ExoPlayer.EventListener mEventListener; 
private ExtractorsFactory extractorsFactory; 
private boolean shouldAutoPlay; 
private DataSource.Factory mediaDataSourceFactory; 

public SimpleExoPlayer getPlayer() { 
    return mPlayer; 
} 

AudioPlayer(Context context, ExoPlayer.EventListener eventListener){ 
    shouldAutoPlay = true; 
    mEventListener = eventListener; 
    mContext = context; 
    state = 0; 
    mediaDataSourceFactory = buildDataSourceFactory(true); 
    extractorsFactory = new DefaultExtractorsFactory(); 
    initializePlayer(); 
} 

void play(String url){ 
    extraData = url; 
    state = 1; 
    setMediaSource(url); 
} 

private void setMediaSource(String audioUrl) { 
    MediaSource mediaSource = new ExtractorMediaSource(Uri.parse(audioUrl), 
      mediaDataSourceFactory, extractorsFactory, null, null); 
    mPlayer.prepare(mediaSource, true, true); 
} 

boolean isPaused() { 
    return state == 2; 
} 

void setState(int state) { 
    this.state = state; 
} 

void pause() { 
    state = 2; 
    mPlayer.setPlayWhenReady(false); 
} 

void play() { 
    state = 1; 
    mPlayer.setPlayWhenReady(true); 
} 

void release(){ 
    mPlayer.release(); 
} 

private void initializePlayer() { 
    if (mPlayer == null) { 
     TrackSelection.Factory videoTrackSelectionFactory = 
       new AdaptiveVideoTrackSelection.Factory(BANDWIDTH_METER); 
     DefaultTrackSelector trackSelector = new DefaultTrackSelector(videoTrackSelectionFactory); 
     mPlayer = ExoPlayerFactory.newSimpleInstance(mContext, trackSelector, new DefaultLoadControl(), 
       null); 
     mPlayer.addListener(mEventListener); 
     EventLogger eventLogger = new EventLogger(trackSelector); 
     mPlayer.addListener(eventLogger); 
     mPlayer.setAudioDebugListener(eventLogger); 
     mPlayer.setMetadataOutput(eventLogger); 
     mPlayer.setPlayWhenReady(shouldAutoPlay); 
    } 
} 


private DataSource.Factory buildDataSourceFactory(boolean useBandwidthMeter) { 
    return ((SEApplication) mContext.getApplicationContext()) 
      .buildDataSourceFactory(useBandwidthMeter ? BANDWIDTH_METER : null); 
} 

public long getDuration() { 
    return mPlayer.getDuration(); 
} 
} 
+0

Ich bin auch auf dem gleichen Problem stecken, brauche Hilfe! –

+0

@NavjotBedi Ich habe meine Lösung hinzugefügt. Ich habe es einfach aus meinem alten Git Repo ausgegraben. Schau, ob es für dich funktioniert. – Sermilion

Antwort

1

Try this: Hinzufügen Laststeuerung scheint das Problem zu beheben.

private void initializePlayer() { 
     if (mPlayer == null) { 
      TrackSelection.Factory videoTrackSelectionFactory = 
        new AdaptiveVideoTrackSelection.Factory(BANDWIDTH_METER); 
      DefaultTrackSelector trackSelector = new DefaultTrackSelector(videoTrackSelectionFactory); 
      LoadControl loadControl = new DefaultLoadControl(); 
      loadControl.shouldStartPlayback(0, false); 
      mPlayer = ExoPlayerFactory.newSimpleInstance(mContext, trackSelector, loadControl, 
        null); 
      mPlayer.addListener(mEventListener); 
     } 
    }