一个基于 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