You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flutter中播放m3u8文件:Exoplayer 403 User-Agent拒绝错误

解决Flutter中m3u8视频指定User-Agent播放问题

方案1:修改video_player的Android原生配置(底层基于ExoPlayer)

video_player的Android端依赖ExoPlayer,直接在原生代码中指定User-Agent即可生效:

  1. 打开android/app/src/main/kotlin/[你的应用包名]/MainActivity.kt
  2. 在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请求头:

  1. 在pubspec.yaml添加依赖:
better_player: ^0.0.82
  1. 初始化播放器时设置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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 10:05:35