logo
0
0
WeChat Login

喵聚 - 视频播放应用

一个基于 Flutter 开发的视频播放应用,支持 HLS 流媒体播放、清晰度切换、全屏播放、评论、弹幕、投稿等功能。

📱 项目概述

  • 项目名称: 喵聚 (miaoju)
  • 版本: v1.1.0
  • Flutter SDK: 3.9.2+
  • 开发语言: Dart
  • 总代码行数: 约 8,000+ 行

✨ 核心功能

✅ 已实现

  • 🏠 首页(视频/专栏双模式)
    • 视频列表展示(封面、标题、作者、播放数、时长等)
    • 专栏文章列表展示
    • 分区(分类)筛选
    • 轮播图展示
    • 搜索功能
    • 分页加载(滚动到底部自动加载更多)
  • � 底部导航栏(首页、我的)
  • 🔐 用户登录/注册
    • 账号密码登录
    • 邮箱验证码注册
    • 图形验证码支持
    • Token 自动刷新机制
    • 找回密码功能
  • 🎥 视频播放页面
    • 视频播放器(HLS 流媒体、多清晰度切换)
    • 作者信息卡片(头像、名字、粉丝数、关注按钮)
    • 视频信息展示(标题、播放量、弹幕数、上传时间、在线人数)
    • 三大操作按钮(点赞、收藏、分享)
    • 分集列表支持(列表/网格视图切换、自动连播)
    • 视频推荐区域(相关推荐、自动连播)
    • 播放进度记忆与上报
    • 响应式布局(宽屏左右两栏,窄屏单栏)
    • 后台播放支持
  • 💬 评论系统
    • 评论列表展示(支持分页加载)
    • 发送评论/回复评论
    • 二级评论(楼中楼)
    • 评论点赞
    • 评论时间戳跳转(点击时间戳跳转到视频对应位置)
    • 表情包选择器(支持深色/浅色主题)
    • 评论预览卡片(YouTube 风格)
    • 评论管理(删除、置顶等)
  • 🎯 弹幕功能
    • 实时弹幕显示
    • 弹幕发送
    • 弹幕开关控制
  • 📤 视频投稿
    • 视频上传(分片上传、断点续传、秒传)
    • 封面上传
    • 多分P支持
    • Token 自动刷新
  • 📝 专栏投稿
    • 文章编辑器
    • 封面上传
    • 文章发布
  • 📚 收藏功能
    • 收藏夹管理
    • 创建收藏夹
    • 添加视频到收藏夹
  • 💬 消息系统
    • 消息中心
    • 私信功能
    • @消息
    • 点赞消息
    • 回复消息
    • 系统公告
  • 👤 个人中心
    • 用户信息展示
    • 用户空间页面
    • 关注/粉丝列表
    • 播放历史
    • 创作中心
  • 🎨 主题系统
    • 深色/浅色主题切换
    • 主题持久化存储
  • ⚙️ 设置页面
    • 版本信息显示
    • 缓存管理
    • 退出即清功能
    • 退出登录

🚧 开发中

  • 动态功能
  • 更多设置选项

项目结构

🎬 视频播放

  • ✅ HLS (M3U8) 流媒体播放
  • ✅ 多清晰度切换(360P/480P/720P/1080P/4K 等)
  • ✅ 友好的清晰度名称显示
  • ✅ 播放进度保存和恢复
  • ✅ 播放历史记录同步
  • ✅ 后台播放支持
  • ✅ 音频会话管理(电话打断等)

📺 播放器功能

  • ✅ 全屏/非全屏模式切换
  • ✅ 横竖屏自动适配
  • ✅ 手势控制(亮度、音量、进度)
  • ✅ 双击暂停/播放
  • ✅ 播放速度调节
  • ✅ 画质自适应
  • ✅ 自定义播放器 UI
  • ✅ 屏幕常亮控制

🎨 界面特性

  • ✅ Material Design 3 设计
  • ✅ 自定义播放器控制栏
  • ✅ 视频信息卡片展示
  • ✅ 作者信息展示
  • ✅ 分P选集列表
  • ✅ 推荐视频列表
  • ✅ 视频操作按钮(点赞、收藏、分享等)
  • ✅ 深色/浅色主题切换
  • ✅ 主题持久化存储
  • ✅ 响应式布局

🏗️ 技术架构

核心技术栈

  • UI 框架: Flutter 3.9.2+
  • 视频播放: media_kit (基于 AndroidX Media3)
    • media_kit: ^1.1.10 - 核心播放器
    • media_kit_video: 1.2.2 - 视频 UI 组件
    • media_kit_libs_video: ^1.0.4 - 原生 libmpv 库
  • 网络请求:
    • http: ^1.2.0 - HTTP 客户端
    • dio: ^5.4.0 - 高级网络库(带重试机制)
  • 图片缓存: cached_network_image: ^3.3.1 - 网络图片缓存
  • 本地存储:
    • shared_preferences: ^2.2.0 - 轻量级键值存储
    • path_provider: ^2.1.1 - 路径获取
  • 分享功能: share_plus: ^7.2.0
  • 国际化: intl: ^0.20.2
  • 后台播放: audio_service: ^0.18.12
  • 音频会话管理: audio_session: ^0.1.21
  • 系统控制: screen_brightness: ^0.2.2+1, volume_controller: ^2.0.7
  • 网络状态监听: connectivity_plus: ^6.0.0
  • 文件加密: crypto: ^3.0.3
  • 文件路径处理: path: ^1.9.0
  • 文件选择: file_picker: ^8.1.6
  • 二维码生成: qr_flutter: ^4.1.0
  • 表情包选择器: emoji_picker_flutter: ^3.0.0
  • 图片选择: image_picker: ^1.0.7
  • UUID 生成: uuid: ^4.2.0
  • 包信息: package_info_plus: ^4.0.0
  • URL 启动: url_launcher: ^6.1.0
  • 屏幕常亮: wakelock_plus: ^1.1.6

项目结构

lib/ ├── main.dart # 应用入口 ├── config/ # 配置 │ └── api_config.dart # API 配置 ├── models/ # 数据模型 │ ├── api_response.dart # API 响应封装 │ ├── video_api_model.dart # 视频 API 模型 │ ├── video_detail.dart # 视频详情模型 │ ├── video_item.dart # 视频列表项模型 │ ├── user_model.dart # 用户模型 │ ├── comment.dart # 评论模型 │ ├── danmaku.dart # 弹幕模型 │ ├── article_list_model.dart # 专栏模型 │ ├── collection_models.dart # 收藏模型 │ ├── message_models.dart # 消息模型 │ ├── auth_models.dart # 认证模型 │ ├── captcha_models.dart # 验证码模型 │ ├── partition.dart # 分区模型 │ ├── upload_video.dart # 视频上传模型 │ ├── upload_article.dart # 文章上传模型 │ ├── carousel_model.dart # 轮播图模型 │ ├── history_models.dart # 历史记录模型 │ ├── comment_manage.dart # 评论管理模型 │ └── loop_mode.dart # 循环模式模型 ├── pages/ # 页面 │ ├── main_page.dart # 主页面(底部导航) │ ├── home_page.dart # 首页(视频/专栏列表) │ ├── profile_page.dart # 个人中心 │ ├── settings_page.dart # 设置页面 │ ├── search_page.dart # 搜索页面 │ ├── login_page.dart # 登录页面 │ ├── register_page.dart # 注册页面 │ ├── reset_password_page.dart # 重置密码页面 │ ├── edit_profile_page.dart # 编辑资料页面 │ ├── history_page.dart # 播放历史页面 │ ├── article/ # 专栏相关 │ │ └── article_detail_page.dart # 专栏详情页 │ ├── video/ # 视频播放相关 │ │ ├── video_play_page.dart # 视频播放页面 │ │ └── widgets/ # 视频页面组件 │ │ ├── media_player_widget.dart # 视频播放器组件 │ │ ├── custom_player_ui.dart # 自定义播放器UI │ │ ├── author_card.dart # 作者信息卡片 │ │ ├── part_list.dart # 分P列表 │ │ ├── recommend_list.dart # 推荐列表 │ │ ├── video_action_buttons.dart # 视频操作按钮 │ │ ├── video_info_card.dart # 视频信息卡片 │ │ ├── comment_list.dart # 评论列表 │ │ └── comment_preview_card.dart # 评论预览卡片 │ ├── upload/ # 投稿相关 │ │ ├── video_upload_page.dart # 视频上传页面 │ │ ├── video_manuscript_page.dart # 视频稿件管理页面 │ │ ├── article_upload_page.dart # 文章上传页面 │ │ ├── article_manuscript_page.dart # 文章稿件管理页面 │ │ └── widgets/ │ │ └── video_resource_list.dart # 视频资源列表 │ ├── message/ # 消息相关 │ │ ├── message_center_page.dart # 消息中心 │ │ ├── whisper_page.dart # 私信页面 │ │ ├── whisper_detail_page.dart # 私信详情页 │ │ ├── at_message_page.dart # @消息页面 │ │ ├── like_message_page.dart # 点赞消息页面 │ │ ├── reply_message_page.dart # 回复消息页面 │ │ └── announce_page.dart # 系统公告页面 │ ├── collection/ # 收藏相关 │ │ ├── collection_list_page.dart # 收藏夹列表 │ │ └── collection_detail_page.dart # 收藏夹详情 │ ├── creator/ # 创作中心 │ │ ├── creator_center_page.dart # 创作中心 │ │ ├── video_manage_page.dart # 视频管理 │ │ └── comment_manage_page.dart # 评论管理 │ └── user/ # 用户相关 │ └── user_space_page.dart # 用户空间页面 ├── services/ # 业务服务 │ ├── hls_service.dart # HLS 流处理服务 │ ├── logger_service.dart # 日志服务 │ ├── video_api_service.dart # 视频 API 服务 │ ├── video_service.dart # 视频业务服务 │ ├── video_submit_api_service.dart # 视频投稿服务 │ ├── article_api_service.dart # 专栏 API 服务 │ ├── article_submit_api_service.dart # 专栏投稿服务 │ ├── auth_service.dart # 认证服务 │ ├── user_service.dart # 用户服务 │ ├── comment_manage_service.dart # 评论管理服务 │ ├── danmaku_service.dart # 弹幕服务 │ ├── collection_service.dart # 收藏服务 │ ├── collection_api_service.dart # 收藏 API 服务 │ ├── message_api_service.dart # 消息 API 服务 │ ├── upload_api_service.dart # 上传服务 │ ├── captcha_service.dart # 验证码服务 │ ├── partition_api_service.dart # 分区服务 │ ├── resource_api_service.dart # 资源服务 │ ├── review_api_service.dart # 审核服务 │ ├── history_service.dart # 历史记录服务 │ ├── theme_service.dart # 主题服务 │ ├── version_service.dart # 版本服务 │ └── carousel_service.dart # 轮播图服务 ├── controllers/ # 控制器 │ ├── video_player_controller.dart # 视频播放器控制器 │ └── danmaku_controller.dart # 弹幕控制器 ├── managers/ # 管理器 │ └── video_player_manager.dart # 视频播放器管理器 ├── theme/ # 主题 │ ├── app_theme.dart # 应用主题 │ ├── app_colors.dart # 主题颜色 │ └── theme_extensions.dart # 主题扩展 ├── utils/ # 工具类 │ ├── http_client.dart # HTTP 客户端封装 │ ├── image_utils.dart # 图片工具类 │ ├── token_manager.dart # Token 管理器 │ ├── quality_utils.dart # 清晰度工具类 │ ├── login_guard.dart # 登录守卫 │ ├── auth_state_manager.dart # 认证状态管理器 │ ├── wakelock_manager.dart # 屏幕常亮管理器 │ ├── timestamp_parser.dart # 时间戳解析器 │ ├── time_utils.dart # 时间工具类 │ ├── redirect_http_service.dart # 重定向 HTTP 服务 │ ├── error_handler.dart # 错误处理器 │ └── whisper_read_status.dart # 私信阅读状态 ├── widgets/ # 通用组件 │ ├── video_card.dart # 视频卡片组件 │ ├── cached_image_widget.dart # 缓存图片组件 │ ├── danmaku_overlay.dart # 弹幕覆盖层 │ ├── danmaku_input.dart # 弹幕输入框 │ ├── collection_dialog.dart # 收藏对话框 │ ├── carousel_widget.dart # 轮播图组件 │ └── slider_captcha_widget.dart # 滑块验证码组件 └── generated/ # 生成文件 └── version_info.dart # 版本信息

🎯 核心组件说明

MediaPlayerWidget (视频播放器)

位置: lib/pages/video/widgets/media_player_widget.dart

核心功能:

  • HLS 流处理: 自动下载并解析 M3U8 文件,转换为本地可访问的播放地址
  • 清晰度切换: 支持多种清晰度无缝切换,保持播放进度
  • 全屏管理: 自动处理横竖屏切换和系统 UI 显示/隐藏
  • 播放状态管理: 完整的播放器生命周期管理(初始化、播放、暂停、销毁)
  • 进度同步: 定期向服务器同步播放进度

关键配置:

MaterialVideoControlsTheme( seekBarMargin: EdgeInsets.only(bottom: 44), // 进度条位置 bottomButtonBarMargin: EdgeInsets.only(bottom: 0), // 控制按钮位置 displaySeekBar: true, // 显示进度条 automaticallyImplySkipNextButton: false, // 隐藏下一集按钮 automaticallyImplySkipPreviousButton: false, // 隐藏上一集按钮 )

HlsService (HLS 流处理)

位置: lib/services/hls_service.dart

功能:

  • 下载 M3U8 文件并解析
  • 转换相对路径为绝对 URL
  • 缓存处理的 M3U8 文件到本地
  • 提供本地文件路径供播放器使用

VideoService (视频业务服务)

位置: lib/services/video_service.dart

功能:

  • 获取视频详情信息
  • 获取视频资源和清晰度列表(指的是播放器)
  • 播放进度管理(指的是播放器)
  • 历史记录管理(指的是播放器)

🛠️ 构建说明

环境要求

  • Flutter SDK: 3.35.7
  • Dart SDK: 3.9.2
  • Android:
    • minSdk: 21
    • targetSdk: 34
    • Java: 11+
    • Kotlin: 1.9.0+

编译命令

Debug 版本

flutter run -d <device_id>

Release 版本 (推荐 - 分架构编译)

flutter build apk --release --split-per-abi

生成的 APK 文件:

  • app-armeabi-v7a-release.apk (25.7MB) - 32位 ARM 设备
  • app-arm64-v8a-release.apk (28.9MB) - 64位 ARM 设备(推荐)
  • app-x86_64-release.apk (33.3MB) - x86_64 设备/模拟器

Release 版本 (通用包)

flutter build apk --release

重要配置说明

Gradle 配置 (android/gradle.properties)

# 禁用 Kotlin 增量编译(解决跨盘符路径问题) kotlin.incremental=false kotlin.incremental.java=false kotlin.caching.enabled=false org.gradle.caching=false # JVM 内存配置 org.gradle.jvmargs=-Xmx4G -XX:MaxMetaspaceSize=1G -XX:+HeapDumpOnOutOfMemoryError # AndroidX 支持 android.useAndroidX=true android.enableJetifier=true

⚠️ 注意: 如果项目和 Flutter SDK/Pub Cache 在不同盘符,必须禁用 Kotlin 增量编译,否则会出现编译错误。

📡 API 接口

后端 API 地址: https://miaoju.hydun.com

主要接口:

  • GET /api/v1/video/getHotVideo - 获取热门视频列表
  • GET /api/v1/video/getVideoById - 获取视频详情
  • GET /api/v1/video/getResourceQuality - 获取视频清晰度列表
  • GET /api/v1/video/getVideoFile - 获取视频播放地址
  • GET /api/v1/video/getRelatedVideoList - 获取相关推荐
  • POST /api/v1/history/video/addHistory - 添加播放历史
  • GET /api/v1/history/video/getProgress - 获取播放进度
  • GET /api/v1/partition/list - 获取分区列表
  • GET /api/v1/article/list - 获取专栏列表
  • GET /api/v1/article/detail - 获取专栏详情
  • POST /api/v1/auth/login - 用户登录
  • POST /api/v1/auth/register - 用户注册
  • POST /api/v1/auth/sendCode - 发送验证码
  • GET /api/v1/user/info - 获取用户信息
  • POST /api/v1/comment/send - 发送评论
  • GET /api/v1/comment/list - 获取评论列表
  • POST /api/v1/danmaku/send - 发送弹幕
  • GET /api/v1/danmaku/list - 获取弹幕列表
  • POST /api/v1/upload/video - 上传视频
  • POST /api/v1/upload/article - 发布专栏
  • GET /api/v1/collection/list - 获取收藏夹列表
  • POST /api/v1/collection/add - 添加收藏
  • GET /api/v1/message/list - 获取消息列表
  • GET /api/v1/message/whisper - 获取私信列表

🐛 已知问题与解决方案

1. Kotlin 编译错误

问题: 跨盘符(C: 和 E:)编译时出现 IllegalArgumentException: this and base files have different roots

解决方案: 在 android/gradle.properties 中禁用 Kotlin 增量编译

2. libmpv.so 找不到

问题: 运行时报错 Cannot find libmpv.so

解决方案: 确保 media_kit_libs_video 依赖已正确添加到 pubspec.yaml

3. 全屏播放黑屏

问题: 切换全屏后画面不显示

解决方案: 已通过正确配置 SystemChrome 和 Widget 生命周期管理解决

4. 弱网环境播放卡顿

问题: 网络不稳定时视频加载失败或图片加载缓慢

解决方案: 已实施网络优化,详见 NETWORK_OPTIMIZATION.md

  • ✅ HTTP 请求自动重试机制(最多3次)
  • ✅ 超时时间优化(15s 连接,30s 接收)
  • ✅ 图片智能缓存(内存+磁盘双层缓存)
  • ✅ HLS 分片下载自动重试

📦 依赖说明

核心依赖

  • media_kit: AndroidX Media3 的 Flutter 封装,提供强大的视频播放能力
    • 支持 HLS、MP4、WebM 等多种格式
    • 内置缓冲管理和自适应码率
    • 原生性能优化

清理的旧依赖

以下组件已使用 media_kit 原生控件替代:

  • ❌ 旧播放器状态管理
  • ❌ 旧手势检测
  • ❌ 旧顶部控制栏
  • ❌ 旧底部控制栏
  • ❌ 旧进度条

🚀 开发指南

调试日志

项目使用 logger_service.dart 提供统一的日志输出:

LoggerService.debug('日志消息'); LoggerService.error('错误消息', error: e, stackTrace: st);

日志输出格式:

  • 🔍 DEBUG - 调试信息
  • ⚠️ WARNING - 警告信息
  • ❌ ERROR - 错误信息
  • 📹 - 视频播放相关日志

添加新视频源

  1. VideoService 中添加新的 API 调用
  2. 更新 VideoDetailModel 以支持新字段
  3. 修改 HlsService 以处理不同的流格式(如需要)
  4. 更新 UI 组件以展示新数据

自定义播放器样式

修改 media_player_widget.dart 中的 MaterialVideoControlsTheme:

MaterialVideoControlsTheme( seekBarMargin: EdgeInsets.only(bottom: 44), // 调整进度条位置 bottomButtonBarMargin: EdgeInsets.only(bottom: 0), // 调整按钮位置 seekBarColor: Colors.blue, // 进度条颜色 // ... 更多配置项 )

📝 版本历史

v1.0.3-beta (2026-02-05)

  • ✅ 添加 ColorScheme 兼容属性到主题颜色类
  • ✅ 更新项目版本信息
  • ✅ 添加版本号注入脚本
  • ✅ 优化 Android SDK 和 NDK 版本
  • ✅ 更新应用图标配置

v1.0.2-beta (2025-01-18)

  • ✅ 投稿功能 Token 刷新统一(使用 TokenManager)
  • ✅ 修复评论区表情包 emoji_picker_flutter 3.x API 兼容问题
  • ✅ 表情选择器深色/浅色主题适配
  • ✅ 回复二级评论自动添加 @用户名 前缀
  • ✅ 发送评论后自动关闭表情面板
  • ✅ 评论预览卡片深色模式适配
  • ✅ 修复合集(分P)自动连播功能
  • ✅ 修复推荐列表自动连播功能
  • ✅ 修复后台播放卡顿问题
  • ✅ 修复音量调节从当前系统音量开始的问题

v1.0.1-beta (2025-01-04)

  • ✅ 初始版本发布
  • ✅ 实现基础视频播放功能
  • ✅ 支持 HLS 流媒体播放
  • ✅ 清晰度切换功能
  • ✅ 全屏播放支持
  • ✅ 播放历史和进度同步
  • ✅ 解决 Kotlin 编译跨盘符问题
  • ✅ 优化播放器控件位置
  • ✅ 添加主题系统
  • ✅ 添加用户登录/注册功能
  • ✅ 添加评论系统
  • ✅ 添加弹幕功能
  • ✅ 添加视频投稿功能
  • ✅ 添加收藏功能
  • ✅ 添加消息系统

🔗 相关链接

📄 许可证

本项目仅供学习交流使用。

👥 贡献者


最后更新: 2026-02-05

About

No description, topics, or website provided.
Language
Dart94.5%
CMake1.4%
C++1%
Kotlin0.5%
Others2.6%