flutter_livepush_plugin

The project supports Android and iOS live stream pushing base on AlivcLivePusher SDK.

AlivcLivePusher Flutter SDK 插件首页

AlivcLivePusher SDK

AlivcLivePusher Android SDK 文档

AlivcLivePusher iOS SDK 文档

Installation

dependencies:
  flutter_livepush_plugin: ^{{latest version}}

说明

阿里云直播推流SDK(ApsaraVideo Pusher SDK,以下简称直播推流SDK)是基于阿里云强大内容分发网络和音视频实时通讯技术的直播客户端推流开发工具,提供简单易用的开放接口、网络自适应的流畅体验、多节点的低延迟优化、功能强大的实时美颜等音视频直播技术服务。

Flutter直播推流SDK在原生层基于 Android/iOS 直播推流SDK,以下是Flutter接口相关调用流程。详细接口调用可参考插件相关dart文件。

功能特性

  • 摄像头推流

Plugin文件说明

lib
├── live_base.dart  推流基础接口
├── live_push_config.dart  推流配置接口
├── live_push_def.dart   主要包含推流配置相关的枚举类
├── live_pusher.dart   推流接口,通过AlivcLivePusher类可以完成音视频的采集推流。
├── live_pusher_preview.dart  推流预览 View
└── beauty
    └── live_beauty.dart 美颜调用接口

快速集成

1.在项目中的 pubspec.yaml 中添加如下依赖:

dependencies:
  flutter_livepush_plugin: ^{{latest version}}

2.添加相关系统权限声明

Android

打开 /android/app/src/main/AndroidManifest.xml 文件,声明需要申请的权限。

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />

iOS

需要在iOS工程中的 Info.plist 中加入对相机和麦克风的权限申请:

<key>NSCameraUsageDescription</key>
<string>授权摄像头权限才能正常视频通话</string>
<key>NSMicrophoneUsageDescription</key>
<string>授权麦克风权限才能正常语音通话</string>

快速开始

1.摄像头推流

1.1.注册SDK

/// 1.创建[AlivcBase]实例
AlivcBase alivcBase = AlivcBase.init();

/// 2.注册SDK
/// 注意:在调用注册SDK方法前,需要按照[registerSDK]接口文档配置好licenseKey和licenseFile。
alivcBase.registerSDK();

/// 3.设置监听回调接口
alivcBase.setObserver();
/// 4.SDK Licence 校验接口回调
alivcBase.setOnLicenceCheck((result, reason) {
    if (result == AlivcLiveLicenseCheckResultCode.success) {
      // 注册SDK成功
    }
});

/// 5.使用[AlivcBase]其它接口
/// 获取原生直播推流SDK版本号
String sdkVersion = await AlivcBase.getSdkVersion();
/// 启用控制台日志打印
AlivcBase.setConsoleEnable(true);
/// 设置log级别为Debug调试级别
AlivcBase.setLogLevel(AlivcLivePushLogLevel.debug);

/// 设置Log路径
String logPath = "xxxx"; // xxxx为手机存放的路径
int maxPartFileSizeInKB = 100 * 1024 * 1024; // 自定义设置
AlivcBase.setLogPath(logPath, maxPartFileSizeInKB);

1.2.配置推流参数

/// 1.创建[AlivcLivePusher]实例
AlivcLivePusher livePusher = AlivcLivePusher.init();
/// 2.创建Config,将将[AlivcLivePusherConfig]同[AlivcLivePusher]联系起来
livePusher.createConfig();
/// 3.创建[AlivcLivePusherConfig]实例
AlivcLivePusherConfig pusherConfig = AlivcLivePusherConfig.init();

/// 4.设置推流参数(根据使用场景,自定义设置)
/// 设置分辨率为540P
pusherConfig.setResolution(AlivcLivePushResolution.resolution_540P);
/// 设置视频采集帧率为20fps。建议用户使用20fps
pusherConfig.setFps(AlivcLivePushFPS.fps_20);
/// 打开码率自适应,默认为true
pusherConfig.setEnableAutoBitrate(true);
/// 设置关键帧间隔。关键帧间隔越大,延时越高。建议设置为1-2
pusherConfig.setVideoEncodeGop(AlivcLivePushVideoEncodeGOP.gop_2);
/// 设置重连时长为2s。单位为毫秒,设置不小于1秒,建议使用默认值即可。
pusherConfig.setConnectRetryInterval(2000);
/// 设置预览镜像为关闭
pusherConfig.setPreviewMirror(false);
/// 设置推流方向为竖屏
pusherConfig.setOrientation(AlivcLivePushOrientation.portrait);
/// 设置打开分辨率自适应
pusherConfig.setEnableAutoResolution(true);

/// 设置暂停图片
String pauseImagePath = "xxxx"; // xxxx为手机存放的图片路径
pusherConfig.setPauseImg(pauseImagePath);

/// 设置预览显示模式为保持视频比例
pusherConfig.setPreviewDisplayMode(AlivcPusherPreviewDisplayMode.preview_aspect_fit);

1.3.进行推流

/// 1.创建推流引擎实例
livePusher.initLivePusher();

/// 2.注册推流听回调
/// 设置推流状态监听回调
livePusher.setInfoDelegate();
/// 设置推流错误监听回调
livePusher.setErrorDelegate();
/// 设置推流网络监听回调
livePusher.setNetworkDelegate();

/// 3.创建推流预览视图
var x = 0.0; // 自定义数值
var y = 0.0; // 自定义数值
var width = MediaQuery.of(context).size.width; // 自定义数值
var height = MediaQuery.of(context).size.height; // 自定义数值
AlivcPusherPreview pusherPreviewView = AlivcPusherPreview(
      onCreated: _onPusherPreviewCreated,
      x: x,
      y: y,
      width: width,
      height: height);
  return Container(
        color: Colors.black,
        width: width,
        height: height,
        child: pusherPreviewView);

// 视图创建回调
_onPusherPreviewCreated(id) {
    /// 4.开始预览
    livePusher.startPreview();
}

/// 开始预览调用之后执行下面的步骤

/// 5.开始推流。预览成功后才可以开始推流
String pushURL = "推流测试地址(rtmp://......)"; 
livePusher.startPushWithURL(pushURL);

/// 6.设置其他推流控制
/// 暂停摄像头推流。可以调用[setPauseImg]后调用[pause]接口,从摄像头推流切换成静态图片推流,音频推流继续。
livePusher.pause();
/// 从静态图片推流切换成摄像头推流,音频推流继续
livePusher.resume();
/// 推流状态下可调用停止推流,完成后推流停止
livePusher.stopPush();
/// 在预览状态下才可以调用停止预览,正在推流状态下,调用停止预览无效。预览停止后,预览画面定格在最后一帧
livePusher.stopPreview();
/// 推流状态下或者接收到所有Error相关回调状态下可调用重新推流,且Error状态下只可以调用此接口(或者[reconnectPushAsync]重连)或者调用[destory]销毁推流。完成后重新开始推流,重启[AlivcLivePusher]内部的一切资源,包括预览、推流等等restart
livePusher.restartPush();
/// 推流状态下或者接收到[setNetworkDelegate]相关的Error回调状态下可调用此接口, 且Error状态下只可以调用此接口(或者[restartPush]重新推流)或者调用[destory]销毁推流。完成后推流重连,重新链接推流
livePusher.reconnectPushAsync();
/// 销毁推流后,推流停止,预览停止,预览画面移除。[AlivcLivePusher]相关的一切资源销毁
livePusher.destory();

1.4.设置背景音乐

/// 开始播放背景音乐
String musicPath = "xxxx"; // xxxx为手机存放的音乐资源路径
livePusher.startBGMWithMusicPathAsync(musicPath);
/// 停止播放背景音乐。若当前正在播放BGM,并且需要切换歌曲,只需要调用开始播放背景音乐接口即可,无需停止当前正在播放的背景音乐
livePusher.stopBGMAsync();
/// 暂停播放背景音乐,背景音乐开始播放后才可调用此接口
livePusher.pauseBGM();
/// 恢复播放背景音乐,背景音乐暂停状态下才可调用此接口
livePusher.resumeBGM();
/// 开启循环播放音乐
livePusher.setBGMLoop(true);
/// 设置降噪开关。打开降噪后,将对采集到的声音中非人声的部分进行过滤处理。可能存在对人声稍微抑制作用,建议让用户自由选择是否开启降噪功能,默认不使用
livePusher.setAudioDenoise(true);
/// 设置耳返开关。耳返功能主要应用于KTV场景。打开耳返后,插入耳机将在耳机中听到主播说话声音。关闭后,插入耳机无法听到人声。未插入耳机的情况下,耳返不起作用
livePusher.setBGMEarsBack(true);
/// 混音设置,设置背景音乐音量
livePusher.setBGMVolume(50); // 设置数值范围:[0 ~ 100],默认:50
/// 混音设置,设置人声采集音量
livePusher.setCaptureVolume(50); // 设置数值范围:[0 ~ 100] 默认:50
/// 设置静音。静音后音乐声音和人声输入都会静音。要单独设置音乐或人声静音可以通过混音音量设置接口来调整
livePusher.setMute(true);

1.5.设置推流截图

/// 调用截图
String dir = "xxxx"; // xxxx代表设置路径
if (Platform.isIOS) {
    /// dir设置要求:iOS系统下是指定存放相对的路径,会在系统沙盒路径下自动生成自定义的目录,设置为""时,则保存在系统沙盒路径下。
    /// dirTypeForIOS:可选设置。不设置默认是放在系统沙盒的[document]路径下。
    livePusher.snapshot(1, 0, dir, dirTypeForIOS: AlivcLiveSnapshotDirType.document);
} else {
    livePusher.snapshot(1, 0, dir);
}
/// 设置截图回调,需要在调用[snapshot]后调用
livePusher.setSnapshotDelegate();

1.6.摄像头相关操作

/// 切换前后摄像头
livePusher.switchCamera();
/// 开启/关闭闪光灯,在前置摄像头时开启闪关灯无效
livePusher.setFlash(false);

/// 焦距调整,即可实现采集画面的缩放功能。传入参数为正数,则放大焦距,传入参数为负数则缩小焦距
double max = await livePusher.getMaxZoom();
livePusher.setZoom(min(1.0, max));

/// 手动对焦
/// [autoFocus]参数表示是否需要自动对焦,该参数仅对调用接口的该次对焦操作生效。后续是否自动对焦沿用上述自动聚焦接口设置值。
double pointX = 50.0; // 自定义
double pointY = 50.0; // 自定义
bool autoFocus = true;
livePusher.focusCameraAtAdjustedPoint(pointX, pointY, autoFocus);

/// 设置不打开自动对焦
livePusher.setAutoFocus(false);
/// 设置不打开预览镜像
livePusher.setPreviewMirror(false);
/// 设置不打开推流镜像
livePusher.setPushMirror(false);

2.添加美颜

/// 1.工程yaml集成[flutter_livepush_beauty_plugin] plugin插件
flutter_livepush_beauty_plugin: ^1.0.0
/// 2.初始化美颜对象
AlivcLiveBeautyManager beautyManager = AlivcLiveBeautyManager.init();
beautyManager.setupBeauty();
/// 3.打开美颜面板
beautyManager.showPanel();
/// 4.关闭美颜面板(安卓使用)
beautyManager.hidePanel();
/// 5.销毁美颜对象
beautyManager.destroyBeauty();