Exoplayer 和 ProgressBar
Exoplayer and ProgressBar
我是 Android Studio 和 ExoPlayer 的新手
我启动了播放器播放视频,但我不知道检测播放器是否正在缓冲并显示进度条来通知用户,有什么帮助吗?
您应该实施 ExoPlayer.EventListener
并覆盖 onPlayerStateChanged()
以检测播放视频进度的状态(STATE_IDLE, STATE_BUFFERING, STATE_READY, STATE_ENDED)
在布局文件中:
<ProgressBar
android:id="@+id/progress_bar"
android:layout_width="48dp"
android:layout_height="48dp"
android:layout_gravity="center"/>
在播放器中 activity:
player.addListener(new ExoPlayer.EventListener() {
@Override
public void onTimelineChanged(Timeline timeline, Object manifest) {}
@Override
public void onTracksChanged(TrackGroupArray trackGroups, TrackSelectionArray trackSelections) {}
@Override
public void onLoadingChanged(boolean isLoading) {}
@Override
public void onPlayerStateChanged(boolean playWhenReady, int playbackState) {
if (playbackState == ExoPlayer.STATE_BUFFERING){
progressBar.setVisibility(View.VISIBLE);
} else {
progressBar.setVisibility(View.INVISIBLE);
}
}
@Override
public void onPlayerError(ExoPlaybackException error) {}
@Override
public void onPositionDiscontinuity() {}
@Override
public void onPlaybackParametersChanged(PlaybackParameters playbackParameters) {}
});
也许对某人有帮助:
<com.google.android.exoplayer2.ui.PlayerView
android:id="@+id/player_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@android:color/black"
app:show_buffering="true"/>
如果您使用的是 Exoplayer2,您可以简单地更改 XML 属性 show_buffering。
有关详细信息,另请参阅 PlayerView.setShowBuffering(PlayerView.ShowBuffering)
。
看到别人的回答,我就这样做了。我使用的 ExoPlayer 版本 2.7.0.
private Player.EventListener eventListener = new Player.EventListener() {
@Override
public void onTimelineChanged(Timeline timeline, Object manifest, int reason) {
}
@Override
public void onTracksChanged(TrackGroupArray trackGroups, TrackSelectionArray trackSelections) {
//Log.i(TAG,"onTracksChanged");
}
@Override
public void onLoadingChanged(boolean isLoading) {
//Log.i(TAG,"onLoadingChanged");
}
@Override
public void onPlayerStateChanged(boolean playWhenReady, int playbackState) {
switch (playbackState) {
case Player.STATE_ENDED:
Log.i("EventListenerState", "Playback ended!");
exoPlayer.setPlayWhenReady(false);
break;
case Player.STATE_READY:
Log.i("EventListenerState", "Playback State Ready!");
hideProgressBar();
break;
case Player.STATE_BUFFERING:
Log.i("EventListenerState", "Playback buffering");
showProgressBar();
break;
case Player.STATE_IDLE:
break;
}
}
@Override
public void onRepeatModeChanged(int repeatMode) {
}
@Override
public void onShuffleModeEnabledChanged(boolean shuffleModeEnabled) {
}
@Override
public void onPlayerError(ExoPlaybackException error) {
}
@Override
public void onPositionDiscontinuity(int reason) {
}
@Override
public void onPlaybackParametersChanged(PlaybackParameters playbackParameters) {
}
@Override
public void onSeekProcessed() {
}
};
mPlayer.addListener(eventListener);
Player.EventListener eventListener = new Player.EventListener() {
@Override
public void onTimelineChanged(Timeline timeline, Object manifest, int reason) {
}
@Override
public void onTracksChanged(TrackGroupArray trackGroups, TrackSelectionArray trackSelections) {
}
@Override
public void onLoadingChanged(boolean isLoading) {
}
@Override
public void onPlayerStateChanged(boolean playWhenReady, int playbackState) {
switch (playbackState) {
case Player.STATE_ENDED:
Log.i("EventListenerState", "Playback ended!");
finish();
break;
}
}
@Override
public void onRepeatModeChanged(int repeatMode) {
}
@Override
public void onShuffleModeEnabledChanged(boolean shuffleModeEnabled) {
}
@Override
public void onPlayerError(ExoPlaybackException error) {
}
@Override
public void onPositionDiscontinuity(int reason) {
}
@Override
public void onPlaybackParametersChanged(PlaybackParameters playbackParameters) {
}
@Override
public void onSeekProcessed() {
}
};
现在 Player.EventListener 已弃用,而不是使用 Player.Listener
simpleExoPlayer.addListener(object : Player.Listener {
override fun onTracksChanged(
trackGroups: TrackGroupArray,
trackSelections: TrackSelectionArray
) {
}
override fun onLoadingChanged(isLoading: Boolean) {}
override fun onPlayerStateChanged(
playWhenReady: Boolean,
playbackState: Int
) {
if (playbackState == Player.STATE_BUFFERING) {
}
}
override fun onPlaybackParametersChanged(playbackParameters: PlaybackParameters) {}
})
您只需在 xml 文件的 playerView 中添加 app:show_buffering="when_playing"
属性
它对我有用。
<com.google.android.exoplayer2.ui.PlayerView
android:id="@+id/videoPlayer"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:resize_mode="fill"
app:surface_type="texture_view"
app:use_controller="true"
app:show_buffering="always" />
我是 Android Studio 和 ExoPlayer 的新手 我启动了播放器播放视频,但我不知道检测播放器是否正在缓冲并显示进度条来通知用户,有什么帮助吗?
您应该实施 ExoPlayer.EventListener
并覆盖 onPlayerStateChanged()
以检测播放视频进度的状态(STATE_IDLE, STATE_BUFFERING, STATE_READY, STATE_ENDED)
在布局文件中:
<ProgressBar
android:id="@+id/progress_bar"
android:layout_width="48dp"
android:layout_height="48dp"
android:layout_gravity="center"/>
在播放器中 activity:
player.addListener(new ExoPlayer.EventListener() {
@Override
public void onTimelineChanged(Timeline timeline, Object manifest) {}
@Override
public void onTracksChanged(TrackGroupArray trackGroups, TrackSelectionArray trackSelections) {}
@Override
public void onLoadingChanged(boolean isLoading) {}
@Override
public void onPlayerStateChanged(boolean playWhenReady, int playbackState) {
if (playbackState == ExoPlayer.STATE_BUFFERING){
progressBar.setVisibility(View.VISIBLE);
} else {
progressBar.setVisibility(View.INVISIBLE);
}
}
@Override
public void onPlayerError(ExoPlaybackException error) {}
@Override
public void onPositionDiscontinuity() {}
@Override
public void onPlaybackParametersChanged(PlaybackParameters playbackParameters) {}
});
也许对某人有帮助:
<com.google.android.exoplayer2.ui.PlayerView
android:id="@+id/player_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@android:color/black"
app:show_buffering="true"/>
如果您使用的是 Exoplayer2,您可以简单地更改 XML 属性 show_buffering。
有关详细信息,另请参阅 PlayerView.setShowBuffering(PlayerView.ShowBuffering)
。
看到别人的回答,我就这样做了。我使用的 ExoPlayer 版本 2.7.0.
private Player.EventListener eventListener = new Player.EventListener() {
@Override
public void onTimelineChanged(Timeline timeline, Object manifest, int reason) {
}
@Override
public void onTracksChanged(TrackGroupArray trackGroups, TrackSelectionArray trackSelections) {
//Log.i(TAG,"onTracksChanged");
}
@Override
public void onLoadingChanged(boolean isLoading) {
//Log.i(TAG,"onLoadingChanged");
}
@Override
public void onPlayerStateChanged(boolean playWhenReady, int playbackState) {
switch (playbackState) {
case Player.STATE_ENDED:
Log.i("EventListenerState", "Playback ended!");
exoPlayer.setPlayWhenReady(false);
break;
case Player.STATE_READY:
Log.i("EventListenerState", "Playback State Ready!");
hideProgressBar();
break;
case Player.STATE_BUFFERING:
Log.i("EventListenerState", "Playback buffering");
showProgressBar();
break;
case Player.STATE_IDLE:
break;
}
}
@Override
public void onRepeatModeChanged(int repeatMode) {
}
@Override
public void onShuffleModeEnabledChanged(boolean shuffleModeEnabled) {
}
@Override
public void onPlayerError(ExoPlaybackException error) {
}
@Override
public void onPositionDiscontinuity(int reason) {
}
@Override
public void onPlaybackParametersChanged(PlaybackParameters playbackParameters) {
}
@Override
public void onSeekProcessed() {
}
};
mPlayer.addListener(eventListener);
Player.EventListener eventListener = new Player.EventListener() {
@Override
public void onTimelineChanged(Timeline timeline, Object manifest, int reason) {
}
@Override
public void onTracksChanged(TrackGroupArray trackGroups, TrackSelectionArray trackSelections) {
}
@Override
public void onLoadingChanged(boolean isLoading) {
}
@Override
public void onPlayerStateChanged(boolean playWhenReady, int playbackState) {
switch (playbackState) {
case Player.STATE_ENDED:
Log.i("EventListenerState", "Playback ended!");
finish();
break;
}
}
@Override
public void onRepeatModeChanged(int repeatMode) {
}
@Override
public void onShuffleModeEnabledChanged(boolean shuffleModeEnabled) {
}
@Override
public void onPlayerError(ExoPlaybackException error) {
}
@Override
public void onPositionDiscontinuity(int reason) {
}
@Override
public void onPlaybackParametersChanged(PlaybackParameters playbackParameters) {
}
@Override
public void onSeekProcessed() {
}
};
现在 Player.EventListener 已弃用,而不是使用 Player.Listener
simpleExoPlayer.addListener(object : Player.Listener {
override fun onTracksChanged(
trackGroups: TrackGroupArray,
trackSelections: TrackSelectionArray
) {
}
override fun onLoadingChanged(isLoading: Boolean) {}
override fun onPlayerStateChanged(
playWhenReady: Boolean,
playbackState: Int
) {
if (playbackState == Player.STATE_BUFFERING) {
}
}
override fun onPlaybackParametersChanged(playbackParameters: PlaybackParameters) {}
})
您只需在 xml 文件的 playerView 中添加 app:show_buffering="when_playing"
属性
它对我有用。
<com.google.android.exoplayer2.ui.PlayerView
android:id="@+id/videoPlayer"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:resize_mode="fill"
app:surface_type="texture_view"
app:use_controller="true"
app:show_buffering="always" />