2017-02-15 5 views
0

ExoPlayer 2로 mp3 파일을 스트리밍하려고합니다. 그러나 초기로드가 너무 오래 걸립니다. 그러나 때로는 동일한 파일 인 1-2 초 안에 재생되기 시작하지만 때로는 10-20 초 동안 멈출 수 있습니다. 아마도 스트리밍에 잘못된 초기화가 수행되고 있습니까?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 내 솔루션을 추가했습니다. 그냥 내 오래된 자식 repo에서 그것을 파서. 나중에 작동하는지 확인하십시오. – Sermilion

답변

1

이 시도 : 여기 내 AudioPlayer 클래스입니다 추가 부하 제어가 문제를 해결하는 것.

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