從零開始寫一個Flutter rtmp推流插件

前言:

Flutter的插件分為兩種:Package和Plugin候齿。
Package是純Dart的尉桩,主要用在組件展示。類似:日歷舌涨、下拉刷新等。
Plugin是通過Flutter的channel調(diào)用原生扔字,原生來實現(xiàn)功能囊嘉;主要用在功能性上。類似:拍照革为、錄音等扭粱。
rtmp推流為功能型的,所以此文講的推流插件是Plugin類型震檩。

環(huán)境:

Mac琢蛤、AS、Xcode抛虏、Flutter1.12

項目地址:flutter_rtmp_plugin

1虐块、創(chuàng)建Plugin工程

1、AS中new flutter project 選擇plugin選項嘉蕾,按提示語一路next贺奠,此處不再贅述。


1.png

2错忱、創(chuàng)建完畢儡率,打開工程目錄如下,主要修改lib以清、ios儿普、android三個目錄。


2.png

2掷倔、Flutter端代碼書寫

class FlutterRtmpPlugin {
//1眉孩、創(chuàng)建channel
  static const MethodChannel _channel =
      const MethodChannel('flutter_rtmp_plugin');
//2、開始直播的api勒葱,參數(shù)為推流地址
  static startLive(String url) async {
    await _channel.invokeMethod('startLive', {"url" : url});
  }

}

在外部的使用方法:
var url = "rtmp://192.168.101.240/rtmplive/test";
FlutterRtmpPlugin.startLive(url);

3浪汪、 iOS端代碼書寫

1、ios目錄如下


image.png

2凛虽、ios端的推流使用的是LFLiveKit
死遭,首先打開ios目錄下后綴為.podspec的文件。
添加依賴

s.dependency 'LFLiveKit'

3凯旋、FlutterRtmpPlugin.m文件
實現(xiàn)邏輯是:ios接收到名為‘ flutter_rtmp_plugin’的channel呀潭,回調(diào)‘ startLive’這個方法钉迷,參數(shù)為‘ url’;ios則調(diào)起推流頁面钠署,推流到url糠聪。

@interface FlutterRtmpPlugin ()
@property(strong, nonatomic) UIViewController *viewController;
@end

@implementation FlutterRtmpPlugin
+ (void)registerWithRegistrar:(NSObject<FlutterPluginRegistrar>*)registrar {
  FlutterMethodChannel* channel = [FlutterMethodChannel
      methodChannelWithName:@"flutter_rtmp_plugin"
            binaryMessenger:[registrar messenger]];

  UIViewController *viewController =
    [UIApplication sharedApplication].delegate.window.rootViewController;

  FlutterRtmpPlugin* instance = [[FlutterRtmpPlugin alloc] initWithViewController:viewController];
  [registrar addMethodCallDelegate:instance channel:channel];
}

- (instancetype)initWithViewController:(UIViewController *)viewController {
  self = [super init];
  if (self) {
    self.viewController = viewController;
  }
  return self;
}

- (void)handleMethodCall:(FlutterMethodCall*)call result:(FlutterResult)result {
  if ([call.method isEqualToString:@"startLive"]) {
      NSDictionary * dict = call.arguments;
      NSLog(@"流地址是 %@",dict[@"url"]);

      LFViewController *liveVC = [[LFViewController alloc] init];
      liveVC.liveUrl = dict[@"url"];
      liveVC.modalPresentationStyle = UIModalPresentationFullScreen;
      [self.viewController presentViewController:liveVC animated:YES completion:nil];
  }
  else {
    result(FlutterMethodNotImplemented);
  }
}

LFViewController就是純ios代碼了。你可以在Assets文件夾下添加資源文件谐鼎、也可以使用xib搭建UI舰蟆。

4、 Android端代碼書寫

1该面、android目錄如下

5.png

2夭苗、android端的推流使用的是SopCastComponent
在plugin模塊的gradle中添加依賴
6.png

dependencies {
    implementation 'androidx.constraintlayout:constraintlayout:+'
    //LFLive
    implementation 'com.laifeng:sopcast-sdk:1.0.4'
}

3信卡、FlutterRtmpPlugin類
注意:flutter1.12版本的回調(diào)方法如下

  @Override
  public void onAttachedToEngine(@NonNull FlutterPluginBinding flutterPluginBinding) {
    FlutterRtmpPlugin plugin = new FlutterRtmpPlugin();
    plugin.context = flutterPluginBinding.getApplicationContext();
    final MethodChannel channel = new MethodChannel(flutterPluginBinding.getFlutterEngine().getDartExecutor(), "flutter_rtmp_plugin");
    channel.setMethodCallHandler(plugin);
  }

flutter1.12版本之前則在registerWith方法中回調(diào)

  public static void registerWith(Registrar registrar) {
    final MethodChannel channel = new MethodChannel(registrar.messenger(), "flutter_rtmp_plugin");
    channel.setMethodCallHandler(new FlutterRtmpPlugin());
  }

寫的時候因為這個隔缀,總是回調(diào)不到,走了不少彎路傍菇。

拿到app的當(dāng)前context或activity之后就可以進行頁面跳轉(zhuǎn)了猾瘸,邏輯和ios一樣

@Override
  public void onMethodCall(@NonNull MethodCall call, @NonNull Result result) {
    if(call.method.equals("startLive")){
      Intent intent = new Intent(context,LivingActivity.class);
      String url = call.argument("url");
      intent.putExtra("url",url);
      intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK );
      context.startActivity(intent);

    } else {
      result.notImplemented();
    }
  }

LivingActivity 就是純android原生代碼了,在這里注意下丢习,flutter調(diào)起的頁面自帶一個導(dǎo)航欄牵触,
在LivingActivity中添加進行去除

requestWindowFeature(Window.FEATURE_NO_TITLE);
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市咐低,隨后出現(xiàn)的幾起案子揽思,更是在濱河造成了極大的恐慌,老刑警劉巖见擦,帶你破解...
    沈念sama閱讀 216,496評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件钉汗,死亡現(xiàn)場離奇詭異,居然都是意外死亡鲤屡,警方通過查閱死者的電腦和手機损痰,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,407評論 3 392
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來酒来,“玉大人卢未,你說我怎么就攤上這事⊙吆海” “怎么了辽社?”我有些...
    開封第一講書人閱讀 162,632評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長翘鸭。 經(jīng)常有香客問我爹袁,道長,這世上最難降的妖魔是什么矮固? 我笑而不...
    開封第一講書人閱讀 58,180評論 1 292
  • 正文 為了忘掉前任失息,我火速辦了婚禮譬淳,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘盹兢。我一直安慰自己邻梆,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,198評論 6 388
  • 文/花漫 我一把揭開白布绎秒。 她就那樣靜靜地躺著浦妄,像睡著了一般。 火紅的嫁衣襯著肌膚如雪见芹。 梳的紋絲不亂的頭發(fā)上剂娄,一...
    開封第一講書人閱讀 51,165評論 1 299
  • 那天,我揣著相機與錄音玄呛,去河邊找鬼阅懦。 笑死,一個胖子當(dāng)著我的面吹牛徘铝,可吹牛的內(nèi)容都是我干的耳胎。 我是一名探鬼主播,決...
    沈念sama閱讀 40,052評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼惕它,長吁一口氣:“原來是場噩夢啊……” “哼怕午!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起淹魄,我...
    開封第一講書人閱讀 38,910評論 0 274
  • 序言:老撾萬榮一對情侶失蹤郁惜,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后甲锡,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體兆蕉,經(jīng)...
    沈念sama閱讀 45,324評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,542評論 2 332
  • 正文 我和宋清朗相戀三年搔体,在試婚紗的時候發(fā)現(xiàn)自己被綠了恨樟。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,711評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡疚俱,死狀恐怖劝术,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情呆奕,我是刑警寧澤养晋,帶...
    沈念sama閱讀 35,424評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站梁钾,受9級特大地震影響绳泉,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜姆泻,卻給世界環(huán)境...
    茶點故事閱讀 41,017評論 3 326
  • 文/蒙蒙 一零酪、第九天 我趴在偏房一處隱蔽的房頂上張望冒嫡。 院中可真熱鬧,春花似錦四苇、人聲如沸孝凌。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,668評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽蟀架。三九已至,卻和暖如春榆骚,著一層夾襖步出監(jiān)牢的瞬間片拍,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,823評論 1 269
  • 我被黑心中介騙來泰國打工妓肢, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留捌省,地道東北人。 一個月前我還...
    沈念sama閱讀 47,722評論 2 368
  • 正文 我出身青樓职恳,卻偏偏與公主長得像所禀,于是被迫代替她去往敵國和親方面。 傳聞我的和親對象是個殘疾皇子放钦,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,611評論 2 353

推薦閱讀更多精彩內(nèi)容

  • 熊志軍~【日精進打卡第1060天】 沈陽眼寶食品~付達新商貿(mào)~眾德營銷 沈陽盛和塾道盛組/稻芽七組 {祈愿} 20...
    熊志軍閱讀 166評論 0 0
  • 我深刻意識到,什么樣的話題和工作能夠吸引我恭金。傳教士般性格如我操禀,在每一次,哪怕是最普通的閑聊當(dāng)中横腿,都希望颓屑,分享。分享...
    素言簡說閱讀 226評論 1 3
  • 一轉(zhuǎn)眼,2019年也快結(jié)束了罗侯。 最近一心在整理東西的時候器腋,特地把日歷拿出來翻看一遍。 今年我和師父钩杰、空空一起經(jīng)歷了...
    一心問禪閱讀 446評論 0 0