Flutter使用better_player播放视频触发ExoPlaybackException问题排查
问题分析与修复方案
核心问题
- 本地视频路径错误:使用
BetterPlayer.file()加载./assets/images/sample_video.mp4,但该方法仅适用于访问设备本地文件系统(如手机存储)的文件,无法识别Flutter项目的assets资源目录,导致播放器找不到视频源。 - 网络视频配置缺失:仅开启
usesCleartextTraffic不足以保证网络视频正常播放,BetterPlayer需要明确的配置来适配网络播放场景。
修复步骤
1. 修复本地视频播放
- 先确保
pubspec.yaml中正确声明assets资源:
flutter: assets: - assets/images/sample_video.mp4
- 将
BetterPlayer.file()替换为BetterPlayer.asset(),传入正确的assets路径:
BetterPlayer.asset("assets/images/sample_video.mp4")
2. 修复网络视频播放
- 为网络视频添加
BetterPlayerConfiguration配置,确保播放器初始化正确的网络参数:
BetterPlayer.network( "http://commondatastorage.googleapis.com/gtv-videos-bucket/sample/ElephantsDream.mp4", betterPlayerConfiguration: BetterPlayerConfiguration( autoPlay: true, aspectRatio: 16/9, ), )
3. 完整修正代码
import 'package:better_player/better_player.dart'; import 'package:flutter/material.dart'; class VideoPlayerScreen extends StatefulWidget { const VideoPlayerScreen({Key? key}) : super(key: key); @override State<VideoPlayerScreen> createState() => _VideoPlayerScreenState(); } class _VideoPlayerScreenState extends State<VideoPlayerScreen> { @override Widget build(BuildContext context) { return Scaffold( body: Column( mainAxisAlignment: MainAxisAlignment.center, crossAxisAlignment: CrossAxisAlignment.center, children: [ // 本地视频播放 AspectRatio( aspectRatio: 16 / 9, child: BetterPlayer.asset("assets/images/sample_video.mp4"), ), const SizedBox(height: 20), // 网络视频播放 AspectRatio( aspectRatio: 16 / 9, child: BetterPlayer.network( "http://commondatastorage.googleapis.com/gtv-videos-bucket/sample/ElephantsDream.mp4", betterPlayerConfiguration: const BetterPlayerConfiguration( autoPlay: true, aspectRatio: 16/9, ), ), ), ], ), ); } }
额外检查项
- 执行
flutter pub get确保better_player依赖完全安装 - 清理项目缓存后重新运行:
flutter clean && flutter run - 确认Android设备网络权限正常(默认已允许网络访问,无需额外配置)
内容的提问来源于stack exchange,提问作者Ayan Dasgupta
相关产品推荐
相关产品推荐

