Android: ExoPlayer - 播放 mp3
Android: ExoPlayer - stream mp3
我正在尝试使用 ExoPlayer 2 流式传输 mp3 文件。但是,初始加载时间过长。但有时它会在 1-2 秒后开始播放,同一个文件,但有时它会卡住 10-20 秒。
也许我对流媒体进行了错误的初始化?
这是我的 AudioPlayer class:
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();
}
}
试试这个: 添加负载控制似乎可以解决问题。
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);
}
}
我正在尝试使用 ExoPlayer 2 流式传输 mp3 文件。但是,初始加载时间过长。但有时它会在 1-2 秒后开始播放,同一个文件,但有时它会卡住 10-20 秒。 也许我对流媒体进行了错误的初始化? 这是我的 AudioPlayer class:
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();
}
}
试试这个: 添加负载控制似乎可以解决问题。
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);
}
}