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

使用video_player包播放WebSocket直播流失败的问题排查

WebSocket直播流在video_player中播放失败的解决方案

一、HTTPS切换后的SSL握手错误

你遇到的WRONG_VERSION_NUMBER错误核心是SSL/TLS版本不匹配,对应解决方法如下:

  • 端口校验:确认HTTPS链接端口是否正确,默认HTTPS使用443端口,若服务器自定义了端口(如8443),链接必须携带端口,示例:https://10.10:8443/home/LiveCamera
  • TLS版本兼容配置:若服务器仅支持TLS 1.0/1.1这类旧版本,需在Android网络安全配置中放宽版本限制(优先建议升级服务器TLS版本):
    在android/app/src/main/res/xml/network_security_config.xml中添加:
    <network-security-config>
        <domain-config cleartextTrafficPermitted="false">
            <domain includeSubdomains="true">10.10</domain>
            <tls-config>
                <min-tls-version>TLSv1.0</min-tls-version>
                <max-tls-version>TLSv1.3</max-tls-version>
            </tls-config>
            <!-- 自签名证书需添加以下信任配置 -->
            <trust-anchors>
                <certificates src="system" />
                <certificates src="@raw/your_self_signed_cert" />
            </trust-anchors>
        </domain-config>
    </network-security-config>
    
  • 自签名证书处理:如果使用自签名证书,必须将证书文件放到android/app/src/main/res/raw目录,并在上述配置中声明信任该证书,否则会触发握手失败。

二、HTTP链接的格式不识别错误

UnrecognizedInputFormatException的本质是:video_player底层依赖的ExoPlayer不直接支持WebSocket协议流,它仅兼容HTTP/HTTPS协议下的标准流媒体(如HLS、DASH、RTSP等)。

解决思路:

  1. 确认流格式:先明确服务器通过WebSocket推送的是FLV裸流、H.264裸流还是WebRTC流,不同格式对应不同解决方案。
  2. 更换播放器方案:
    • WebRTC流首选flutter_webrtc:如果是WebRTC协议的直播流,直接使用flutter_webrtc插件,它原生支持WebSocket信令交互与媒体播放,示例代码:
      import 'package:flutter_webrtc/flutter_webrtc.dart';
      
      class _WebRTCPlayerState extends State<WebRTCPlayer> {
        final RTCVideoRenderer _videoRenderer = RTCVideoRenderer();
        WebSocket? _signalingSocket;
        RTCPeerConnection? _peerConnection;
      
        @override
        void initState() {
          super.initState();
          _initRenderer();
          _connectSignalingServer();
        }
      
        Future<void> _initRenderer() async {
          await _videoRenderer.initialize();
        }
      
        void _connectSignalingServer() async {
          _signalingSocket = await WebSocket.connect('ws://10.10:8000/home/LiveCamera');
          _signalingSocket?.listen((message) {
            // 处理服务器发送的信令(如SDP、ICE候选),建立WebRTC连接
            // 具体逻辑需根据服务器信令协议实现
          });
        }
      
        @override
        void dispose() {
          _videoRenderer.dispose();
          _signalingSocket?.close();
          _peerConnection?.dispose();
          super.dispose();
        }
      
        @override
        Widget build(BuildContext context) {
          return Scaffold(
            appBar: AppBar(),
            body: RTCVideoView(_videoRenderer),
          );
        }
      }
      
    • 自定义ExoPlayer数据源:如果是WebSocket传输的普通媒体流(如FLV),可以通过编写原生代码扩展ExoPlayer的DataSource来支持WebSocket,但实现复杂度较高。
    • 转换流媒体协议:如果有权限修改服务器配置,将WebSocket流转换为HLS/DASH等ExoPlayer支持的协议,即可直接用video_player播放。

内容的提问来源于stack exchange,提问作者user16357470

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 11:30:53