flutter 直播推流和拉流

本文介绍了如何在Flutter中使用ApiVideoLiveStream进行实时视频推流,以及如何利用FijkPlayer进行拉流,包括初始化、权限检查、开始推流、主播预览和拉流配置,同时提及了Android和iOS平台的兼容性。
摘要由CSDN通过智能技术生成

推流

apivideo_live_stream: ^1.1.3

组件地址:https://pub-web.flutter-io.cn/packages/apivideo_live_stream

1.初始化和检查权限

import 'package:apivideo_live_stream/apivideo_live_stream.dart'; //导包

late ApiVideoLiveStreamController _controllerStream; //直播推流

//重要代码 需要绑定key不然切换页面会停止摄像头采集
final GlobalKey<ScaffoldState> _scaffoldKey = GlobalKey<ScaffoldState>();
 
 @override
 void initState() {
 initPlatformState(); //检查权限
 _controllerStream = createLiveStreamController(); 

_controllerStream.initialize().catchError((e) {});

 //延迟1秒 直播推流
 Future.delayed(Duration(milliseconds: 1000), () {
  startrecording(); //开始推流
 });
}

// 检查权限 我这里封装了方法,你自己按照自己的来
  Future<void> initPlatformState() async {
    //相机权限
    if (await camerabool() == false) {
      return;
    }
    //录音权限
    if (await microphonebool() == false) {
      return;
    }
  }

 //直播推流初始化
 ApiVideoLiveStreamController createLiveStreamController() {
    return ApiVideoLiveStreamController(
        initialAudioConfig: AudioConfig(), //设置音频属性
        initialVideoConfig: VideoConfig.withDefaultBitrate(resolution: Resolution.RESOLUTION_720), //设置视频属性
        initialCameraPosition: CameraPosition.front, //设置摄像头是正面还是反面
        onConnectionSuccess: () {
          //连接成功
          setState(() {});
        },
        onConnectionFailed: (error) {
          //连接失败时
          if (mounted) {}
        },
        onDisconnection: () {
          //断开连接时
          if (mounted) {}
        },
        onError: (error) {
          // 获取错误,如缺少权限,
          if (mounted) {}
        });
  }

2.开始推流

  //开始推流
  startrecording() async {
    startStreaming(rtmpurl).then((_) {
      if (mounted) {}
    }).catchError((error) {
    print('开始推流失败+'error.toString())
    });
  }
//开始推流
  startStreaming(String rtmpurl) async {
    // '?token=' + token
    return await _controllerStream.startStreaming(
        streamKey: '测试时这里随便', url: 'rtmp://你自己的rtmp地址');
  }

3.主播预览自己的画面

//主播 UI
Center(
  child: SizedBox.expand(
   child: FittedBox(
     fit: BoxFit.cover,
     clipBehavior: Clip.hardEdge,
     child: Container(                                                                                  
        width:MediaQuery.of(context).size.width,
        child: ApiVideoCameraPreview(key: _scaffoldKey, controller: _controllerStream)))))

拉流

fijkplayer: ^0.11.0

组件地址:https://pub-web.flutter-io.cn/packages/fijkplayer

import 'package:fijkplayer/fijkplayer.dart';//导包

FijkPlayer fplayer= FijkPlayer();

// 开始拉流
 ligaturePullflow() {
    attribute(fplayer); //延迟设置
    Fpalyer.setDataSource('播放地址 一般是.flv', autoPlay: true); //播放
  }

//延迟设置
  attribute(FijkPlayer fijkplayer) {
     await fijkplayer.setVolume(0.6); //设置音量
    // 解决延迟
    fijkplayer.setOption(1, "analyzemaxduration", 100); //设置分析最大持续时间
    fijkplayer.setOption(1, "probesize", 1024); //设置探测文件的大小。
    fijkplayer.setOption(FijkOption.playerCategory, "reconnect", 5); //设置重新连接次数。
    fijkplayer.setOption(1, "flush_packets", 1); // 启用刷新数据包。
    fijkplayer.setOption(4, "packet-buffering", 0); //禁用数据包缓冲
    fijkplayer.setOption(4, "framedrop", 1); //启用帧丢弃,允许在视频渲染过程中丢弃一些帧,以减少延迟。
  }

UI画面

 FijkView(
  player: fplayer,
  fit: FijkFit.cover,
  panelBuilder: (FijkPlayer player, FijkData data, BuildContext context, Size viewSize, Rect texturePos) {
     return Container();
    },
   ),

销毁

@override
void dispose() async {
_controllerStream.stopStreaming();//停止推流
_controllerStream.dispose(); //释放 推流
fplayer.release(); //释放播放
}

Android和iOS都可以推流和拉流,本人亲测有效,如有补充不全 请谅解

  • 5
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值