Flutter中播放m3u8文件:Exoplayer 403 User-Agent拒绝错误
解决Flutter中m3u8视频指定User-Agent播放问题
方案1:修改video_player的Android原生配置(底层基于ExoPlayer)
video_player的Android端依赖ExoPlayer,直接在原生代码中指定User-Agent即可生效:
- 打开
android/app/src/main/kotlin/[你的应用包名]/MainActivity.kt - 在
configureFlutterEngine方法中添加ExoPlayer配置代码:
import android.os.Bundle import androidx.annotation.NonNull import io.flutter.embedding.android.FlutterActivity import io.flutter.embedding.engine.FlutterEngine import com.google.android.exoplayer2.DefaultRenderersFactory import com.google.android.exoplayer2.ExoPlayer import com.google.android.exoplayer2.upstream.DefaultHttpDataSource class MainActivity: FlutterActivity() { override fun configureFlutterEngine(@NonNull flutterEngine: FlutterEngine) { super.configureFlutterEngine(flutterEngine) // 替换为目标ExoPlayer User-Agent val customUserAgent = "ExoPlayerLib/2.19.1" val dataSourceFactory = DefaultHttpDataSource.Factory().setUserAgent(customUserAgent) val renderersFactory = DefaultRenderersFactory(this) ExoPlayer.Builder(this, renderersFactory) .setMediaSourceFactory(dataSourceFactory) .build() } }
修改后重新运行项目,video_player即可使用指定UA请求m3u8资源。
方案2:使用better_player库(无需修改原生,支持自定义UA)
better_player是video_player的增强封装,支持直接配置HTTP请求头:
- 在
pubspec.yaml添加依赖:
better_player: ^0.0.82
- 初始化播放器时设置User-Agent:
import 'package:better_player/better_player.dart'; BetterPlayerController _betterPlayerController; void initPlayer() { BetterPlayerDataSource dataSource = BetterPlayerDataSource( BetterPlayerDataSourceType.network, "你的m3u8视频地址", httpHeaders: { "User-Agent": "ExoPlayerLib/2.19.1" // 替换为目标UA }, ); _betterPlayerController = BetterPlayerController( BetterPlayerConfiguration(), betterPlayerDataSource: dataSource, ); }
后续直接使用BetterPlayer组件渲染即可。
方案3:优化WebView播放性能(解决掉帧问题)
如果必须使用WebView,可通过以下配置提升流畅度:
import 'package:webview_flutter/webview_flutter.dart'; WebView( initialUrl: "你的m3u8播放页面地址", javascriptMode: JavascriptMode.unrestricted, onWebViewCreated: (controller) { controller.runJavascript(''' document.body.style.margin = '0'; document.body.style.padding = '0'; '''); }, // Android端启用硬件加速 androidWebViewWidgetCreationParams: AndroidWebViewWidgetCreationParams( initialSettings: AndroidInitialSettings( hardwareAccelerationEnabled: true, mediaPlaybackRequiresUserGesture: false, ), ), // iOS端优化播放配置 iosWebViewWidgetCreationParams: IOSWebViewWidgetCreationParams( initialSettings: IOSInitialSettings( allowsInlineMediaPlayback: true, mediaTypesRequiringUserActionForPlayback: IOSMediaTypes.none, ), ), );
这些设置能减少WebView的性能消耗,缓解掉帧问题。
补充说明
- chewie_player基于video_player,只要给video_player配置好UA,chewie就能正常使用;
- loco_player若无法自定义UA,建议切换到上述方案,灵活性更强。
内容的提问来源于stack exchange,提问作者dhruv aggarwal
相关产品推荐
相关产品推荐

