flutter_vlc_player在macOS播放RTSP报错,求跨平台替代包
关于flutter_vlc_player的macOS支持及替代方案
flutter_vlc_player对macOS的支持情况
flutter_vlc_player目前不支持macOS平台,你遇到的PlatformException(channel-error, Unable to establish connection on channel.)错误,正是因为该包未实现macOS端的平台通道,无法完成Flutter与原生层的通信。
支持macOS和Windows的RTSP Flutter包推荐
1. dart_vlc
纯Dart实现的VLC媒体播放器绑定,原生支持Windows、macOS、Linux,对RTSP流的兼容性良好,无需手动配置原生依赖。
示例代码(替换你的原有实现):
import 'package:flutter/material.dart'; import 'package:dart_vlc/dart_vlc.dart'; class IPCameraScreen extends StatefulWidget { final String url; const IPCameraScreen({Key? key, required this.url}) : super(key: key); @override _IPCameraScreenState createState() => _IPCameraScreenState(); } class _IPCameraScreenState extends State<IPCameraScreen> { late Player _player; late VideoController _videoController; @override void initState() { super.initState(); DartVLC.initialize(); _initializePlayer(); } @override void dispose() { _player.dispose(); super.dispose(); } void _initializePlayer() { _player = Player(id: 0); _videoController = VideoController(_player); _player.open( Media.network('rtsp://192.168.100.208:80/rtsp/streaming?channel=5&subtype=1'), autoStart: true, ); } @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: const Text('IP Camera Preview'), ), body: Center( child: Column( mainAxisAlignment: MainAxisAlignment.center, children: <Widget>[ Video( controller: _videoController, aspectRatio: 16 / 9, placeholder: const Center(child: CircularProgressIndicator()), ), ], ), ), ); } }
2. media_kit
跨平台媒体播放框架,支持全平台(Windows、macOS、Linux、Android、iOS),支持RTSP、RTMP等多种流媒体协议,提供丰富的播放控制和自定义选项。
使用时需在pubspec.yaml中添加对应平台的依赖:
dependencies: media_kit: ^1.1.10+1 media_kit_video: ^1.1.7 media_kit_native_event_loop: ^1.0.8 # 平台特定依赖 media_kit_libs_macos_video: ^1.0.4 # macOS media_kit_libs_windows_video: ^1.0.6 # Windows
示例代码片段:
import 'package:flutter/material.dart'; import 'package:media_kit/media_kit.dart'; import 'package:media_kit_video/media_kit_video.dart'; class IPCameraScreen extends StatefulWidget { final String url; const IPCameraScreen({Key? key, required this.url}) : super(key: key); @override State<IPCameraScreen> createState() => _IPCameraScreenState(); } class _IPCameraScreenState extends State<IPCameraScreen> { late final Player player; late final VideoController controller; @override void initState() { super.initState(); player = Player(); controller = VideoController(player); player.open(Media(widget.url)); } @override void dispose() { player.dispose(); super.dispose(); } @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar(title: const Text('IP Camera Preview')), body: Center( child: Video( controller: controller, aspectRatio: 16/9, placeholder: const CircularProgressIndicator(), ), ), ); } }
内容的提问来源于stack exchange,提问作者irfan ahmad
相关产品推荐
相关产品推荐

