2017-02-15 81 views
0

我想用ExoPlayer 2流式传输MP3文件。但是,它需要太长的初始加载。但有时它会在1-2秒内开始播放,同一个文件,但有时它会卡住10-20秒。 也许我做错了流的初始化? 这里是我的AudioPlayer类:Android:ExoPlayer - 流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

我也陷在同样的问题上,需要帮助! –

+0

@NavjotBedi我已经添加了我的解决方案。只是从我旧的git回购中挖出来的。看看它是否适用于你。 – Sermilion

回答

1

试试这个:添加负载控制似乎解决这个问题。

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