Flutter 中使用 rtsp 协议
在 Flutter 中可以集成 VLC 播放器通过 rtsp 协议连接到监控相机来实现远程监控,当然也可以用来做直播 APP。
使用 flutter_vlc_player 库
扩展包地址 。
首先在 pubspec.yaml 中添加库引用:
dependencies: flutter_vlc_player: ^7.2.0
安卓端配置
- 在
android/app/src/main/AndroidManifest.xml
中添加网络使用权限
<uses-permission android:name="android.permission.INTERNET" />
- 如果 rtsp 为非加密连接,则需要加上明文网络使用权限
android:usesClearTextTraffic="true"
- 在
android/app/build.gradle
中加入以下配置:
android { packagingOptions { // Fixes duplicate libraries build issue, // when your project uses more than one plugin that depend on C++ libs. pickFirst 'lib/**/libc++_shared.so' } buildTypes { release { minifyEnabled true useProguard true proguardFiles getDefaultProguardFile( 'proguard-android-optimize.txt'), 'proguard-rules.pro' } } }
请注意,如果您的 gradle 版本较新,那么 useProguard 已经不再使用,请删除这一行。
- 在
android/app
目录内新建一个proguard-rules.pro
文件,内容为
-keep class org.videolan.libvlc.** { *; }
- 调整
android/app/build.gradle
中的 minSdkVersion。
defaultConfig { minSdkVersion 27 //20以上 targetSdkVersion flutter.targetSdkVersion versionCode flutterVersionCode.toInteger() versionName flutterVersionName }
使用 flutter_vlc_player 库
import 'package:flutter/material.dart';import 'package:flutter_vlc_player/flutter_vlc_player.dart';class VLCTest extends StatefulWidget { const VLCTest({super.key}); @override State<VLCTest> createState() => _VLCTestState();}class _VLCTestState extends State<VLCTest> { late VlcPlayerController _vlcPlayerController; String host = "rtsp://192.168.2.22:8554/mystream"; @override void initState() { super.initState(); _vlcPlayerController = VlcPlayerController.network( host, hwAcc: HwAcc.full, autoPlay: true); } @override void dispose() async { // TODO: implement dispose super.dispose(); await _vlcPlayerController.stopRendererScanning(); await _vlcPlayerController.dispose(); } @override Widget build(BuildContext context) { return FractionallySizedBox( widthFactor: 1, heightFactor: 1, child: Center( child: VlcPlayer(controller: _vlcPlayerController, aspectRatio: 16 / 9), ), ); }}
本地测试
下面就是本地测试环节,需要在本地建立 rtsp 服务器并推流,在 flutter 程序中连接并拉取。
使用 OBS+OBS-RTSPServer 插件搭建 rtsp 服务器并将桌面推流
目前(截止 2023 年 7 月)OBS-RTSPServer 插件最新 release 版本为 3.0,支持的最新 OBS 版本为 28,
在 下载 28.x 版本安装 OBS 本体。
然后在 下载 3.0.0 版本插件安装
全部安装完成后,在 OBS 中新建场景-桌面。
在工具-RTSP 服务器中设置“目标”中的 URL 为 rtsp://localhost:8554/mystream
,然后打开服务器即可。
注意,不需要设置 OBS 的推流功能,现在就已经在 rtsp 服务器中推流了。
使用 flutter 进行测试
将 flutter 代码中的 host 地址改为 rtsp://localhost:8554/mystream
,打开这个界面稍等一会儿就会自动播放。
如果 flutter 中无法播放,请下载一个 VLC 播放器或 potplayer 播放上述地址进行测试。
延迟优化
经过上述步骤的测试,我们发现有延迟问题,推流端的延迟我们无法保证,因为往往推流的是监控设备。
于是我们先优化拉取的延迟问题。
我们可以将 VLC 的拉流缓存时长调低就可以极大缓解延迟问题。
_vlcPlayerController = VlcPlayerController.network( host, hwAcc: HwAcc.full, autoPlay: true, options: VlcPlayerOptions( advanced: VlcAdvancedOptions([ VlcAdvancedOptions.liveCaching(100), VlcAdvancedOptions.networkCaching(100) ])));
当然如果您有更好的优化方案,烦请告知,感谢!
打包压缩
通过 flutter build apk
后,我们发现安装包竟增加了 100+MB!这是不可接收的!
使用 flutter build apk --analyze-size
分析我们发现在打包过程中 flutter 自动将所有 abi 打包进了 APK 包里。
于是我们可以用 flutter build apk --release --split-per-abi --target-platform android-arm,android-arm64
来指定目标平台。
针对打包后体积过大的问题,有人如下说道
VLC uses lots of native code. As a result, it has 18-30MB of native libraries per CPU architecture. While that will be compressed somewhat in the APK, a 57MB increase in APK is actually better than I would expect.
You either need to:
Live with it, or
Use splits or product flavors to indicate which subset of CPU architectures you are willing to support (the library itself supports arm64-v8a, armeabi-v7a, mips, x86, and x86_64), or
Do not use VLC