一个基于 Flutter 开发的视频播放应用,支持 HLS 流媒体播放、清晰度切换、全屏播放、评论、弹幕、投稿等功能。
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.0intl: ^0.20.2audio_service: ^0.18.12audio_session: ^0.1.21screen_brightness: ^0.2.2+1, volume_controller: ^2.0.7connectivity_plus: ^6.0.0crypto: ^3.0.3path: ^1.9.0file_picker: ^8.1.6qr_flutter: ^4.1.0emoji_picker_flutter: ^3.0.0image_picker: ^1.0.7uuid: ^4.2.0package_info_plus: ^4.0.0url_launcher: ^6.1.0wakelock_plus: ^1.1.6lib/
├── 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 # 版本信息
位置: lib/pages/video/widgets/media_player_widget.dart
核心功能:
关键配置:
MaterialVideoControlsTheme(
seekBarMargin: EdgeInsets.only(bottom: 44), // 进度条位置
bottomButtonBarMargin: EdgeInsets.only(bottom: 0), // 控制按钮位置
displaySeekBar: true, // 显示进度条
automaticallyImplySkipNextButton: false, // 隐藏下一集按钮
automaticallyImplySkipPreviousButton: false, // 隐藏上一集按钮
)
位置: lib/services/hls_service.dart
功能:
位置: lib/services/video_service.dart
功能:
flutter run -d <device_id>
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 设备/模拟器flutter build apk --release
# 禁用 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 地址: 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 - 获取私信列表问题: 跨盘符(C: 和 E:)编译时出现 IllegalArgumentException: this and base files have different roots
解决方案: 在 android/gradle.properties 中禁用 Kotlin 增量编译
问题: 运行时报错 Cannot find libmpv.so
解决方案: 确保 media_kit_libs_video 依赖已正确添加到 pubspec.yaml
问题: 切换全屏后画面不显示
解决方案: 已通过正确配置 SystemChrome 和 Widget 生命周期管理解决
问题: 网络不稳定时视频加载失败或图片加载缓慢
解决方案: 已实施网络优化,详见 NETWORK_OPTIMIZATION.md
以下组件已使用 media_kit 原生控件替代:
项目使用 logger_service.dart 提供统一的日志输出:
LoggerService.debug('日志消息');
LoggerService.error('错误消息', error: e, stackTrace: st);
日志输出格式:
VideoService 中添加新的 API 调用VideoDetailModel 以支持新字段HlsService 以处理不同的流格式(如需要)修改 media_player_widget.dart 中的 MaterialVideoControlsTheme:
MaterialVideoControlsTheme(
seekBarMargin: EdgeInsets.only(bottom: 44), // 调整进度条位置
bottomButtonBarMargin: EdgeInsets.only(bottom: 0), // 调整按钮位置
seekBarColor: Colors.blue, // 进度条颜色
// ... 更多配置项
)
本项目仅供学习交流使用。
最后更新: 2026-02-05