文章目录
参考Media3 ExoPlayerHello Exoplayer添加依赖网络权限和http添加布局PlayerView加载playerView
Player events监听播放器的状态播放器日志在某一时刻触发事件
Playlists多视频播放列表调整播放列表替代播放列表和清除播放列表查询播放列表重复模式(REPEAT_MODE_OFF关闭循环播放、REPEAT_MODE_ALL循环整个列表、REPEAT_MODE_ONE循环单个)随机播放MediaItem设置Id监听媒体列表变化
参考
https://developer.android.google.cn/guide/topics/media/exoplayer/listening-to-player-events https://blog.csdn.net/yuantian_shenhai/article/details/127870700?spm=1001.2014.3001.5501
Media3 ExoPlayer
Hello Exoplayer
添加依赖
///media3
implementation "androidx.media3:media3-exoplayer:1.0.2"
implementation "androidx.media3:media3-exoplayer-dash:1.0.2"
implementation "androidx.media3:media3-ui:1.0.2"
网络权限和http
android:usesCleartextTraffic="true"
添加布局PlayerView
加载playerView
package com.example.mediaandroidjava;
import androidx.appcompat.app.AppCompatActivity;
import androidx.media3.common.MediaItem;
import androidx.media3.exoplayer.ExoPlayer;
import androidx.media3.ui.PlayerView;
import android.os.Bundle;
public class MainActivity extends AppCompatActivity {
private PlayerView playerView;
private ExoPlayer exoPlayer;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//配置player
playerView = findViewById(R.id.player_view);
exoPlayer = new ExoPlayer.Builder(this).build();
playerView.setPlayer(exoPlayer);
MediaItem mediaItem = MediaItem.fromUri("http://clips.vorwaerts-gmbh.de/big_buck_bunny.mp4");
exoPlayer.setMediaItem(mediaItem);
exoPlayer.prepare();
exoPlayer.play();
}
@Override
protected void onDestroy() {
super.onDestroy();
//释放资源
exoPlayer.release();
}
}
Player events
监听播放器的状态
///监听播放器的状态
exoPlayer.addListener(new Player.Listener() {
@Override
public void onIsPlayingChanged(boolean isPlaying) {
Player.Listener.super.onIsPlayingChanged(isPlaying);
Log.i(TAG, "isPlaying:" + isPlaying);
}
@Override
public void onPlayerError(@NonNull PlaybackException error) {
Player.Listener.super.onPlayerError(error);
@Nullable Throwable cause = error.getCause();
if (cause instanceof HttpDataSource.HttpDataSourceException) {
// An HTTP error occurred.
HttpDataSource.HttpDataSourceException httpError = (HttpDataSource.HttpDataSourceException) cause;
if (httpError instanceof HttpDataSource.InvalidResponseCodeException) {
Log.i(TAG, "HttpDataSource.InvalidResponseCodeException");
} else {
Log.i(TAG, "not HttpDataSource.InvalidResponseCodeException");
}
}
}
@Override
public void onEvents(Player player, Player.Events events) {
Player.Listener.super.onEvents(player, events);
if (events.contains(Player.EVENT_PLAYBACK_STATE_CHANGED) || events.contains(Player.EVENT_PLAY_WHEN_READY_CHANGED)) {
// uiModule.updateUi(player);
Log.i(TAG, "状态改变");
for (int i = 0; i
// Do something at the specified playback position.
Log.i(TAG, "视频播放至五秒时触发");
}).setLooper(Looper.getMainLooper()).setPosition(/* mediaItemIndex= */ 0, /* positionMs= */ 5_000)
// .setPayload(customPayloadData)
.setDeleteAfterDelivery(false).send();
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-a55phlOk-1686539491630)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20230612090715605.png)]
Playlists
多视频播放列表
MediaItem mediaItemFirst = MediaItem.fromUri("http://clips.vorwaerts-gmbh.de/big_buck_bunny.mp4");
MediaItem mediaItemSecond = MediaItem.fromUri("http://vjs.zencdn.net/v/oceans.mp4");
exoPlayer = new ExoPlayer.Builder(this).build();
exoPlayer.addMediaItem(mediaItemFirst);
exoPlayer.addMediaItem(mediaItemSecond);
调整播放列表
///调整播放列表
// 在位置1处添加一个媒体
exoPlayer.addMediaItem(/* index= */ 1, MediaItem.fromUri("http://clips.vorwaerts-gmbh.de/big_buck_bunny.mp4"));
// 将位置2处的媒体移到首位
exoPlayer.moveMediaItem(/* currentIndex= */ 2, /* newIndex= */ 0);
// 将位置0处的媒体移除
exoPlayer.removeMediaItem(/* index= */ 0);
替代播放列表和清除播放列表
///替代播放列表和清除播放列表
List newItems = ImmutableList.of(MediaItem.fromUri("http://clips.vorwaerts-gmbh.de/big_buck_bunny.mp4"), MediaItem.fromUri("http://clips.vorwaerts-gmbh.de/big_buck_bunny.mp4"));
exoPlayer.setMediaItems(newItems, true);
exoPlayer.clearMediaItems();
查询播放列表
///查询播放列表
exoPlayer.getMediaItemAt(0);
exoPlayer.getMediaItemCount();
exoPlayer.getCurrentMediaItem();
exoPlayer.hasNextMediaItem();
exoPlayer.getNextMediaItemIndex();
重复模式(REPEAT_MODE_OFF关闭循环播放、REPEAT_MODE_ALL循环整个列表、REPEAT_MODE_ONE循环单个)
///重复模式(REPEAT_MODE_OFF关闭循环播放、REPEAT_MODE_ALL循环整个列表、REPEAT_MODE_ONE循环单个)
exoPlayer.setRepeatMode(Player.REPEAT_MODE_OFF);
exoPlayer.setRepeatMode(Player.REPEAT_MODE_ALL);
exoPlayer.setRepeatMode(Player.REPEAT_MODE_ONE);
随机播放
exoPlayer.setShuffleOrder(new ShuffleOrder.DefaultShuffleOrder(new int[]{2, 1, 0}, 1));
exoPlayer.setShuffleModeEnabled(true);
MediaItem设置Id
MediaItem mediaItem = new MediaItem.Builder().setUri(uri).setMediaId(mediaId).build();
MediaItem mediaItem = new MediaItem.Builder().setUri(uri).setTag(metadata).build();
监听媒体列表变化
exoPlayer.addListener(new Player.Listener() {
//监听播放过渡到另一个媒体
@Override
public void onMediaItemTransition(@Nullable MediaItem mediaItem, int reason) {
Player.Listener.super.onMediaItemTransition(mediaItem, reason);
@Nullable String metadata = null;
Log.i(TAG, "过渡");
if (mediaItem != null && mediaItem.localConfiguration != null) {
metadata = (String) mediaItem.localConfiguration.tag;
}
//updateUiForPlayingMediaItem(metadata);
}
//添加、删除或移动媒体项时,将调用 立即与 .此回调是 即使玩家尚未做好准备,也会调用。
@Override
public void onTimelineChanged(@NonNull Timeline timeline, int reason) {
Player.Listener.super.onTimelineChanged(timeline, reason);
if (reason == TIMELINE_CHANGE_REASON_PLAYLIST_CHANGED) {
//updateUiForPlaylist(timeline);
}
}
});
|