使用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等)。
解决思路:
- 确认流格式:先明确服务器通过WebSocket推送的是FLV裸流、H.264裸流还是WebRTC流,不同格式对应不同解决方案。
- 更换播放器方案:
- 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播放。
- WebRTC流首选flutter_webrtc:如果是WebRTC协议的直播流,直接使用
内容的提问来源于stack exchange,提问作者user16357470
相关产品推荐
相关产品推荐

