flutter 中播放RTSP推流

6,575 阅读2分钟

最近有个需求在APP上播放RTSP推流的视频,调研了解决方案大概有几种: 1.自己封装大B站的Ijkplayer,但时间有限,不适合这么搞。 2.使用收费的SDK,大牛直播等,太贵了,不考虑。 3.后来逛GitHub,发现了一个神器:FijkPlayerbefovy大神自己封装了一个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'     // 注意这一句
        }
    }