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();
}
}
我也陷在同樣的問題上,需要幫助! –
@NavjotBedi我已經添加了我的解決方案。只是從我舊的git回購中挖出來的。看看它是否適用於你。 – Sermilion