最近有个需求在APP上播放RTSP推流的视频,调研了解决方案大概有几种: 1.自己封装大B站的Ijkplayer,但时间有限,不适合这么搞。 2.使用收费的SDK,大牛直播等,太贵了,不考虑。 3.后来逛GitHub,发现了一个神器:FijkPlayer,befovy大神自己封装了一个Ijkplayer,居然有现成的,美滋滋,感谢befovy大神。
FijkPlayer的文档在这里。 下面来说说一些使用的注意:
1.播放RTSP的视频流的时候一定要注意将缓冲区关闭:
// ijkPlayer 初始化不启用缓冲,避免画面卡死不动
Future<void> _initPlayer() async {
...
// ijkPlayer 初始化不启用缓冲,避免RTSP流卡死
await _player.setOption(FijkOption.playerCategory, 'packet-buffering', 0);
await _player.setOption(FijkOption.playerCategory, 'framedrop', 1);
....
}
2.和flutter_screenutil一起使用的时候进入全屏模式会导致长宽重绘,建议的做法是将该页面的所有长宽写死。
// 进入横屏播放后会改变Screen的基础参考尺寸,这里先做宽高值得存储,避免修改
double h240 = utils.setHeight(240);
double w750 = utils.setHeight(750);
double f26 = utils.setFont(26);
double h20 = utils.setHeight(20);
double h10 = utils.setHeight(10);
double f42 = utils.setFont(42);
double f28 = utils.setFont(28);
double h25 = utils.setHeight(25);
double w10 = utils.setWidth(10);
double h30 = utils.setHeight(30);
double w30 = utils.setWidth(30);
double w80 = utils.setWidth(80);
double h05 = utils.setHeight(0.5);
double w690 = utils.setWidth(690);
double h455 = utils.setHeight(455);
double w28 = utils.setWidth(28);
3.flutter 1.12版本中,运行flutter build apk生成的apk包会闪退,这个现象是由于开启混淆所导致的。解决办法在这里。
// 在Android/app/路径下,新建proguard-rules.pro
# Flutter Wrapper:
-keep class io.flutter.app.** { *; }
-keep class io.flutter.plugin.** { *; }
-keep class io.flutter.util.** { *; }
-keep class io.flutter.view.** { *; }
-keep class io.flutter.** { *; }
-keep class io.flutter.plugins.** { *; }
// 注意这里,不要混淆 ijk 相关的java 文件,不然会导致无法正常播放
-keep class tv.danmaku.ijk.media.player.** { *; }
接下来更改 Android/app/build.grade:
buildTypes {
release {
// TODO: Add your own signing config for the release build.
// Signing with the debug keys for now, so `flutter run --release` works.
signingConfig signingConfigs.debug
minifyEnabled true // 注意这一句
useProguard true // 注意这一句
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' // 注意这一句
}
}