Player.EventListener 的 SimpleExoPlayer 不工作
Player.EventListener of SimpleExoPlayer is not working
我正在从 URL 播放视频,我想在视频开始播放时显示一段文字。文本可能类似于“6 之 1”。
我添加了 Player.EventListener
但它不起作用。
// Player Event Listener
Player.EventListener eventListener = new Player.EventListener() {
@Override
public void onTimelineChanged(Timeline timeline, Object manifest) {
}
@Override
public void onTracksChanged(TrackGroupArray trackGroups, TrackSelectionArray trackSelections) {
}
@Override
public void onLoadingChanged(boolean isLoading) {
progressBar.setVisibility(isLoading ? View.VISIBLE : View.GONE);
}
@Override
public void onPlayerStateChanged(boolean playWhenReady, int playbackState) {
if (playbackState == PlaybackStateCompat.ACTION_SKIP_TO_NEXT) {
Toast.makeText(VideoActivity.this, "next", Toast.LENGTH_SHORT).show();
}
if (playbackState == PlaybackStateCompat.ACTION_SKIP_TO_PREVIOUS) {
Toast.makeText(VideoActivity.this, "previous", Toast.LENGTH_SHORT).show();
}
}
@Override
public void onRepeatModeChanged(int repeatMode) {
}
@Override
public void onPlayerError(ExoPlaybackException error) {
}
@Override
public void onPositionDiscontinuity() {
}
@Override
public void onPlaybackParametersChanged(PlaybackParameters playbackParameters) {
}
};
更新
onCreate 方法
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_video);
ButterKnife.bind(this);
presenter = new VideosPresenter(this);
presenter.getVideoUrls();
// 1. Create a default TrackSelector
bandwidthMeter = new DefaultBandwidthMeter();
videoTrackSelectionFactory = new AdaptiveTrackSelection.Factory(bandwidthMeter);
trackSelector = new DefaultTrackSelector(videoTrackSelectionFactory);
// 2. Create a default LoadControl
LoadControl loadControl = new DefaultLoadControl();
// 3. Create the player
player = ExoPlayerFactory.newSimpleInstance(this, trackSelector, loadControl);
mediaDataSourceFactory = new DefaultDataSourceFactory(this, Util.getUserAgent(this, getString(R.string.app_name)), null);
simpleExoPlayerView = findViewById(R.id.player_view);
simpleExoPlayerView.requestFocus();
simpleExoPlayerView.setPlayer(player);
presenter = new VideosPresenter(this);
player.addListener(eventListener);
}
初始化
private void initializePlayer() {
simpleExoPlayerView.requestFocus();
TrackSelection.Factory videoTrackSelectionFactory =
new AdaptiveTrackSelection.Factory(bandwidthMeter);
trackSelector = new DefaultTrackSelector(videoTrackSelectionFactory);
player = ExoPlayerFactory.newSimpleInstance(this, trackSelector);
simpleExoPlayerView.setPlayer(player);
MediaSource[] mediaSources = new MediaSource[urlList.size()];
for (int i = 0; i < urlList.size(); i++) {
mediaSources[i] = buildMediaSource(Uri.parse(urlList.get(i)));
}
MediaSource mediaSource = mediaSources.length == 1 ? mediaSources[0]
: new ConcatenatingMediaSource(mediaSources);
player.prepare(mediaSource);
}
已获取视频网址
@Override
public void onVideosFetched(String[] urls) {
if (urls.length == 0) {
showAlertAndFinish(getString(R.string.empty_video_message));
return;
}
urlList.addAll(new ArrayList<>(Arrays.asList(urls)));
initializePlayer();
/* if ((*//*Util.SDK_INT <= 23 ||*//* player == null)) {
initializePlayer();
}*/
}
调用 onVideosFetched(String[] urls)
方法后,您正在 initializePlayer()
方法中重新初始化播放器。但是你还没有在那里分配 eventListener。
private void initializePlayer() {
simpleExoPlayerView.requestFocus();
TrackSelection.Factory videoTrackSelectionFactory =
new AdaptiveTrackSelection.Factory(bandwidthMeter);
trackSelector = new DefaultTrackSelector(videoTrackSelectionFactory);
player = ExoPlayerFactory.newSimpleInstance(this, trackSelector);
simpleExoPlayerView.setPlayer(player);
MediaSource[] mediaSources = new MediaSource[urlList.size()];
for (int i = 0; i < urlList.size(); i++) {
mediaSources[i] = buildMediaSource(Uri.parse(urlList.get(i)));
}
MediaSource mediaSource = mediaSources.length == 1 ? mediaSources[0]
: new ConcatenatingMediaSource(mediaSources);
player.prepare(mediaSource);
//Add lister to the player
player.addListener(eventListener);
}
希望对您有所帮助:)
您似乎使用了错误的播放状态常量。 ExoPlayer has 4 state constants in Player 分别是 Player.STATE_IDLE、Player.STATE_BUFFERING、Player.STATE_READY 和 Player.STATE_ENDED。
要检测玩家何时从时间轴中的一项转到另一项,您需要使用 onPositionDiscontinuity 而不是 onPlaybackStateChanged。这样的事情可能会成功:
int lastWindowIndex;
@Override
public void onPositionDiscontinuity(int reason) {
int currentWindowIndex = player.getCurrentWindowIndex();
if (reason == Player.DISCONTINUITY_REASON_PERIOD_TRANSITION) {
if (lastPlaybackState == currentWindowIndex - 1) {
// skipped to next
} else if (lastPlaybackState == currentWindowIndex + 1) {
// skipped to previous
} else {
// jumped more than one window index
}
}
lastWindowIndex = currentWindowIndex;
startOrUpdateNotification();
}
我正在从 URL 播放视频,我想在视频开始播放时显示一段文字。文本可能类似于“6 之 1”。
我添加了 Player.EventListener
但它不起作用。
// Player Event Listener
Player.EventListener eventListener = new Player.EventListener() {
@Override
public void onTimelineChanged(Timeline timeline, Object manifest) {
}
@Override
public void onTracksChanged(TrackGroupArray trackGroups, TrackSelectionArray trackSelections) {
}
@Override
public void onLoadingChanged(boolean isLoading) {
progressBar.setVisibility(isLoading ? View.VISIBLE : View.GONE);
}
@Override
public void onPlayerStateChanged(boolean playWhenReady, int playbackState) {
if (playbackState == PlaybackStateCompat.ACTION_SKIP_TO_NEXT) {
Toast.makeText(VideoActivity.this, "next", Toast.LENGTH_SHORT).show();
}
if (playbackState == PlaybackStateCompat.ACTION_SKIP_TO_PREVIOUS) {
Toast.makeText(VideoActivity.this, "previous", Toast.LENGTH_SHORT).show();
}
}
@Override
public void onRepeatModeChanged(int repeatMode) {
}
@Override
public void onPlayerError(ExoPlaybackException error) {
}
@Override
public void onPositionDiscontinuity() {
}
@Override
public void onPlaybackParametersChanged(PlaybackParameters playbackParameters) {
}
};
更新
onCreate 方法
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_video);
ButterKnife.bind(this);
presenter = new VideosPresenter(this);
presenter.getVideoUrls();
// 1. Create a default TrackSelector
bandwidthMeter = new DefaultBandwidthMeter();
videoTrackSelectionFactory = new AdaptiveTrackSelection.Factory(bandwidthMeter);
trackSelector = new DefaultTrackSelector(videoTrackSelectionFactory);
// 2. Create a default LoadControl
LoadControl loadControl = new DefaultLoadControl();
// 3. Create the player
player = ExoPlayerFactory.newSimpleInstance(this, trackSelector, loadControl);
mediaDataSourceFactory = new DefaultDataSourceFactory(this, Util.getUserAgent(this, getString(R.string.app_name)), null);
simpleExoPlayerView = findViewById(R.id.player_view);
simpleExoPlayerView.requestFocus();
simpleExoPlayerView.setPlayer(player);
presenter = new VideosPresenter(this);
player.addListener(eventListener);
}
初始化
private void initializePlayer() {
simpleExoPlayerView.requestFocus();
TrackSelection.Factory videoTrackSelectionFactory =
new AdaptiveTrackSelection.Factory(bandwidthMeter);
trackSelector = new DefaultTrackSelector(videoTrackSelectionFactory);
player = ExoPlayerFactory.newSimpleInstance(this, trackSelector);
simpleExoPlayerView.setPlayer(player);
MediaSource[] mediaSources = new MediaSource[urlList.size()];
for (int i = 0; i < urlList.size(); i++) {
mediaSources[i] = buildMediaSource(Uri.parse(urlList.get(i)));
}
MediaSource mediaSource = mediaSources.length == 1 ? mediaSources[0]
: new ConcatenatingMediaSource(mediaSources);
player.prepare(mediaSource);
}
已获取视频网址
@Override
public void onVideosFetched(String[] urls) {
if (urls.length == 0) {
showAlertAndFinish(getString(R.string.empty_video_message));
return;
}
urlList.addAll(new ArrayList<>(Arrays.asList(urls)));
initializePlayer();
/* if ((*//*Util.SDK_INT <= 23 ||*//* player == null)) {
initializePlayer();
}*/
}
调用 onVideosFetched(String[] urls)
方法后,您正在 initializePlayer()
方法中重新初始化播放器。但是你还没有在那里分配 eventListener。
private void initializePlayer() {
simpleExoPlayerView.requestFocus();
TrackSelection.Factory videoTrackSelectionFactory =
new AdaptiveTrackSelection.Factory(bandwidthMeter);
trackSelector = new DefaultTrackSelector(videoTrackSelectionFactory);
player = ExoPlayerFactory.newSimpleInstance(this, trackSelector);
simpleExoPlayerView.setPlayer(player);
MediaSource[] mediaSources = new MediaSource[urlList.size()];
for (int i = 0; i < urlList.size(); i++) {
mediaSources[i] = buildMediaSource(Uri.parse(urlList.get(i)));
}
MediaSource mediaSource = mediaSources.length == 1 ? mediaSources[0]
: new ConcatenatingMediaSource(mediaSources);
player.prepare(mediaSource);
//Add lister to the player
player.addListener(eventListener);
}
希望对您有所帮助:)
您似乎使用了错误的播放状态常量。 ExoPlayer has 4 state constants in Player 分别是 Player.STATE_IDLE、Player.STATE_BUFFERING、Player.STATE_READY 和 Player.STATE_ENDED。
要检测玩家何时从时间轴中的一项转到另一项,您需要使用 onPositionDiscontinuity 而不是 onPlaybackStateChanged。这样的事情可能会成功:
int lastWindowIndex;
@Override
public void onPositionDiscontinuity(int reason) {
int currentWindowIndex = player.getCurrentWindowIndex();
if (reason == Player.DISCONTINUITY_REASON_PERIOD_TRANSITION) {
if (lastPlaybackState == currentWindowIndex - 1) {
// skipped to next
} else if (lastPlaybackState == currentWindowIndex + 1) {
// skipped to previous
} else {
// jumped more than one window index
}
}
lastWindowIndex = currentWindowIndex;
startOrUpdateNotification();
}