Android ExoPlayer实现播放列表视频自动播放下一集方案咨询
影视流媒体APP剧集连播功能实现方案
1. 定义剧集数据结构
1.1 后端JSON返回格式
单独设计剧集接口的返回结构,示例如下:
{ "movie_id": 12345, "total_episode": 24, "episode_list": [ { "episode_id": 1001, "episode_no": 1, "episode_title": "第1集 序幕", "video_url": "你的视频资源地址", "cover_url": "剧集封面地址", "duration": 2765, "skip_start": 90, "skip_end": 2680 }, { "episode_id": 1002, "episode_no": 2, "episode_title": "第2集 相遇", "video_url": "你的视频资源地址", "cover_url": "剧集封面地址", "duration": 2698, "skip_start": 90, "skip_end": 2610 } ] }
1.2 新增Episode数据模型类
对应JSON结构创建实体类:
public class Episode { private int episodeId; private int episodeNo; private String episodeTitle; private String videoUrl; private String coverUrl; private int duration; private int skipStart; private int skipEnd; private long watchProgress; // 本地存储的观看进度 // 自动生成所有属性的getter、setter方法 }
2. 实现剧集列表适配器
新建EpisodeAdapter.java适配RecyclerView,核心逻辑如下:
public class EpisodeAdapter extends RecyclerView.Adapter<EpisodeAdapter.EpisodeViewHolder> { private List<Episode> episodeList; private int currentPlayPos = 0; // 标记当前播放的剧集下标 private OnEpisodeClickListener clickListener; public interface OnEpisodeClickListener { void onEpisodeSelected(Episode episode, int position); } // 构造方法传入剧集列表和点击回调 public EpisodeAdapter(List<Episode> list, OnEpisodeClickListener listener) { this.episodeList = list; this.clickListener = listener; } // 列表项绑定时处理选中态:正在播放的剧集高亮、显示播放中标记 @Override public void onBindViewHolder(@NonNull EpisodeViewHolder holder, int position) { Episode item = episodeList.get(position); holder.tvEpisodeNo.setText(String.valueOf(item.getEpisodeNo())); holder.tvEpisodeTitle.setText(item.getEpisodeTitle()); if (position == currentPlayPos) { holder.itemView.setBackgroundColor(Color.parseColor("#1AFF4081")); holder.ivPlayingTag.setVisibility(View.VISIBLE); } else { holder.itemView.setBackgroundColor(Color.TRANSPARENT); holder.ivPlayingTag.setVisibility(View.GONE); } holder.itemView.setOnClickListener(v -> clickListener.onEpisodeSelected(item, position)); } // 对外提供更新当前播放下标的方法 public void updateCurrentPlayPos(int newPos) { int oldPos = currentPlayPos; currentPlayPos = newPos; notifyItemChanged(oldPos); notifyItemChanged(newPos); } // ViewHolder创建、getItemCount等常规逻辑自行补充 static class EpisodeViewHolder extends RecyclerView.ViewHolder { TextView tvEpisodeNo, tvEpisodeTitle; ImageView ivPlayingTag; public EpisodeViewHolder(@NonNull View itemView) { super(itemView); // 绑定控件id } } }
3. 影片详情页改造
3.1 布局调整
在activity_movie_details.xml的播放器下方、影片简介区域之后新增RecyclerView控件,用于展示剧集列表。
3.2 页面逻辑适配
- 初始化剧集RecyclerView,设置垂直线性布局管理器
- 进入页面后请求剧集接口,拿到返回数据后初始化Adapter,设置给RecyclerView
- 实现剧集点击回调:用户手动点击某一集时,直接调用切换播放的方法,更新当前播放下标
4. ExoPlayer自动连播核心逻辑
给ExoPlayer添加播放状态监听,实现自动切集:
private int currentPlayPos = 0; private List<Episode> episodeList; // 初始化播放器时添加监听 player.addListener(new Player.Listener() { @Override public void onPlaybackStateChanged(int playbackState) { // 播放结束触发自动切集 if (playbackState == Player.STATE_ENDED) { int nextPos = currentPlayPos + 1; if (nextPos < episodeList.size()) { switchToEpisode(nextPos); } } } }); // 公共切换剧集方法,手动点击和自动切集都调用该方法 private void switchToEpisode(int targetPos) { Episode targetEpisode = episodeList.get(targetPos); // 1. 停止当前播放,替换MediaItem player.stop(); player.setMediaItem(MediaItem.fromUri(targetEpisode.getVideoUrl())); // 2. 可选:跳过片头 player.seekTo(targetEpisode.getSkipStart() * 1000L); player.prepare(); player.play(); // 3. 更新列表选中态 currentPlayPos = targetPos; episodeAdapter.updateCurrentPlayPos(targetPos); episodeRecycler.smoothScrollToPosition(targetPos); }
5. YouTube式交互优化
- 播放到剩余3秒时弹出半透明下一集提示浮层,显示下一集标题,提供「立即播放」和「取消」按钮,10秒无操作自动跳转
- 已播放过的剧集在列表中显示灰色进度条,标记观看进度
- 切换到未看完的剧集时,弹出二次确认选项:「继续播放」/「从头播放」
- 新增全局自动连播开关,用户可在设置页关闭自动连播功能
内容的提问来源于stack exchange,提问作者windowssolution
相关产品推荐
相关产品推荐

