公司网站建设与维护方案,证书查询入口官网,怎样做服装厂的企业网站模版,新浪门户网站是谁做的前言
在之前的「基于声网 Flutter SDK 实现多人视频通话」里#xff0c;我们通过 Flutter 声网 SDK 完美实现了跨平台和多人视频通话的效果#xff0c;那么本篇我们将在之前例子的基础上进阶介绍一些常用的特效功能#xff0c;包括虚拟背景、色彩增强、空间音频、基础变声…前言
在之前的「基于声网 Flutter SDK 实现多人视频通话」里我们通过 Flutter 声网 SDK 完美实现了跨平台和多人视频通话的效果那么本篇我们将在之前例子的基础上进阶介绍一些常用的特效功能包括虚拟背景、色彩增强、空间音频、基础变声功能。
本篇主要带你了解 SDK 里几个实用的 API 实现相对简单。
01 虚拟背景
虚拟背景是视频会议里最常见的特效之一在声网 SDK 里可以通过enableVirtualBackground方法启动虚拟背景支持点击这里查看虚拟背景接口文档。
首先因为我们是在 Flutter 里使用所以我们可以在 Flutter 里放一张assets/bg.jpg图片作为背景这里有两个需要注意的点
assets/bg.jpg图片需要在pubspec.yaml文件下的assets添加引用 assets:- assets/bg.jpg需要在pubspec.yaml文件下添加path_provider: ^2.0.8和path: ^1.8.2依赖因为我们需要把图片保存在 App 本地路径下
如下代码所示首先我们通过 Flutter 内的rootBundle读取到bg.jpg然后将其转化为bytes 之后调用getApplicationDocumentsDirectory获取路径保存在的应用的/data目录下然后就可以把图片路径配置给enableVirtualBackground方法的source从而加载虚拟背景。
Futurevoid _enableVirtualBackground() async {ByteData data await rootBundle.load(assets/bg.jpg);Listint bytes data.buffer.asUint8List(data.offsetInBytes, data.lengthInBytes);Directory appDocDir await getApplicationDocumentsDirectory();String p path.join(appDocDir.path, bg.jpg);final file File(p);if (!(await file.exists())) {await file.create();await file.writeAsBytes(bytes);}await _engine.enableVirtualBackground(enabled: true,backgroundSource: VirtualBackgroundSource(backgroundSourceType: BackgroundSourceType.backgroundImg,source: p),segproperty:const SegmentationProperty(modelType: SegModelType.segModelAi));setState(() {});
}如下图所示是都开启虚拟背景图片之后的运行效果当然这里还有两个需要注意的参数
BackgroundSourceType 可以配置backgroundColor虚拟背景颜色、backgroundImg虚拟背景图片、backgroundBlur 虚拟背景模糊 这三种情况基本可以覆盖视频会议里的所有场景SegModelType 可以配置为segModelAi智能算法或segModelGreen绿幕算法两种不同场景下的抠图算法。 这里需要注意的是在官方的提示里建议只在搭载如下芯片的设备上使用该功能应该是对于 GPU 有要求 骁龙 700 系列 750G 及以上骁龙 800 系列 835 及以上天玑 700 系列 720 及以上麒麟 800 系列 810 及以上麒麟 900 系列 980 及以上 另外需要注意的是为了将自定义背景图的分辨率与 SDK 的视频采集分辨率适配声网 SDK 会在保证自定义背景图不变形的前提下对自定义背景图进行缩放和裁剪。
02 美颜
美颜作为视频会议里另外一个最常用的功能声网也提供了setBeautyEffectOptions方法支持一些基础美颜效果调整。点击查看美颜接口文档
如下代码所示setBeautyEffectOptions方法里主要是通过BeautyOptions来调整画面的美颜风格参数的具体作用如下表格所示。 这里的 .5 只是做了一个 Demo 效果具体可以根据你的产品需求配置出几种固定模版让用户选择。 _engine.setBeautyEffectOptions(enabled: true,options: const BeautyOptions(lighteningContrastLevel:LighteningContrastLevel.lighteningContrastHigh,lighteningLevel: .5,smoothnessLevel: .5,rednessLevel: .5,sharpnessLevel: .5,),
);运行后效果如下图所示开了 0.5 参数后的美颜整体画面更加白皙同时唇色也更加明显。
没开美颜开了美颜
03 色彩增强
接下来要介绍的一个 API 是色彩增强setColorEnhanceOptions如果是美颜还无法满足你的需求那么色彩增强 API 可以提供更多参数来调整你的需要的画面风格。点击查看色彩增强接口文档
如下代码所示色彩增强 API 很简单主要是调整ColorEnhanceOptions的 strengthLevel和skinProtectLevel参数也就是调整色彩强度和肤色保护的效果。 _engine.setColorEnhanceOptions(enabled: true,options: const ColorEnhanceOptions(strengthLevel: 6.0, skinProtectLevel: 0.7));如下图所示因为摄像头采集到的视频画面可能存在色彩失真的情况而色彩增强功能可以通过智能调节饱和度和对比度等视频特性提升视频色彩丰富度和色彩还原度最终使视频画面更生动。 开启增强之后画面更抢眼了。 没开增强开了美颜增强04 空间音效
其实声音调教才是重头戏声网既然叫声网在音频处理上肯定不能落后在声网 SDK 里就可以通过enableSpatialAudio打开空间音效的效果。点击查看空间音效接口文档
_engine.enableSpatialAudio(true);什么是空间音效简单说就是特殊的 3D 音效它可以将音源虚拟成从三维空间特定位置发出包括听者水平面的前后左右以及垂直方向的上方或下方。 本质上空间音效就是通过一些声学相关算法计算模拟实现类似空间 3D 效果的音效实现。 同时你还可以通过setRemoteUserSpatialAudioParams来配置空间音效的相关参数如下表格所示可以看到声网提供了非常丰富的参数来让我们可以自主调整空间音效例如这里面的enable_blur和enable_air_absorb效果就很有意思十分推荐大家去试试。 音频类的效果这里就无法展示了强烈推荐大家自己动手去试试。 05 人声音效
另外一个推荐的 API 就是人声音效setAudioEffectPreset 调用该方法可以通过 SDK 预设的人声音效点击查看人声音效接口文档在不会改变原声的性别特征的前提下修改用户的人声效果例如
_engine.setAudioEffectPreset(AudioEffectPreset.roomAcousticsKtv);声网 SDK 里预设了非常丰富的AudioEffectPreset如下表格所示从场景效果如 KTV、录音棚到男女变声再到恶搞的音效猪八戒等可以说是相当惊艳。 PS为获取更好的人声效果需要在调用该方法前将setAudioProfile的 scenario 设为audioScenarioGameStreaming(3)
_engine.setAudioProfile(profile: AudioProfileType.audioProfileDefault,scenario: AudioScenarioType.audioScenarioGameStreaming);当然这里需要注意的是这个方法只推荐用在对人声的处理上不建议用于处理含音乐的音频数据。
最后完整代码如下所示
class VideoChatPage extends StatefulWidget {const VideoChatPage({Key? key}) : super(key: key);overrideStateVideoChatPage createState() _VideoChatPageState();
}class _VideoChatPageState extends StateVideoChatPage {late final RtcEngine _engine;///初始化状态late final Futurebool? initStatus;///当前 controllerlate VideoViewController currentController;///是否加入聊天bool isJoined false;/// 记录加入的用户idMapint, VideoViewController remoteControllers {};overridevoid initState() {super.initState();initStatus _requestPermissionIfNeed().then((value) async {await _initEngine();///构建当前用户 currentControllercurrentController VideoViewController(rtcEngine: _engine,canvas: const VideoCanvas(uid: 0),);return true;}).whenComplete(() setState(() {}));}Futurevoid _requestPermissionIfNeed() async {if (Platform.isMacOS) {return;}await [Permission.microphone, Permission.camera].request();}Futurevoid _initEngine() async {//创建 RtcEngine_engine createAgoraRtcEngine();// 初始化 RtcEngineawait _engine.initialize(const RtcEngineContext(appId: appId,));_engine.registerEventHandler(RtcEngineEventHandler(// 遇到错误onError: (ErrorCodeType err, String msg) {if (kDebugMode) {print([onError] err: $err, msg: $msg);}},onJoinChannelSuccess: (RtcConnection connection, int elapsed) {// 加入频道成功setState(() {isJoined true;});},onUserJoined: (RtcConnection connection, int rUid, int elapsed) {// 有用户加入setState(() {remoteControllers[rUid] VideoViewController.remote(rtcEngine: _engine,canvas: VideoCanvas(uid: rUid),connection: const RtcConnection(channelId: cid),);});},onUserOffline:(RtcConnection connection, int rUid, UserOfflineReasonType reason) {// 有用户离线setState(() {remoteControllers.remove(rUid);});},onLeaveChannel: (RtcConnection connection, RtcStats stats) {// 离开频道setState(() {isJoined false;remoteControllers.clear();});},));// 打开视频模块支持await _engine.enableVideo();// 配置视频编码器编码视频的尺寸像素帧率await _engine.setVideoEncoderConfiguration(const VideoEncoderConfiguration(dimensions: VideoDimensions(width: 640, height: 360),frameRate: 15,),);await _engine.startPreview();}overridevoid dispose() {_engine.leaveChannel();super.dispose();}overrideWidget build(BuildContext context) {return Scaffold(appBar: AppBar(),body: Stack(children: [FutureBuilderbool?(future: initStatus,builder: (context, snap) {if (snap.data ! true) {return const Center(child: Text(初始化ing,style: TextStyle(fontSize: 30),),);}return AgoraVideoView(controller: currentController,);}),Align(alignment: Alignment.topLeft,child: SingleChildScrollView(scrollDirection: Axis.horizontal,child: Row(///增加点击切换children: List.of(remoteControllers.entries.map((e) InkWell(onTap: () {setState(() {remoteControllers[e.key] currentController;currentController e.value;});},child: SizedBox(width: 120,height: 120,child: AgoraVideoView(controller: e.value,),),),)),),),)],),floatingActionButton: FloatingActionButton(onPressed: () async {// 加入频道_engine.joinChannel(token: token,channelId: cid,uid: 0,options: const ChannelMediaOptions(channelProfile:ChannelProfileType.channelProfileLiveBroadcasting,clientRoleType: ClientRoleType.clientRoleBroadcaster,),);},),persistentFooterButtons: [ElevatedButton.icon(onPressed: () {_enableVirtualBackground();},icon: const Icon(Icons.accessibility_rounded),label: const Text(虚拟背景)),ElevatedButton.icon(onPressed: () {_engine.setBeautyEffectOptions(enabled: true,options: const BeautyOptions(lighteningContrastLevel:LighteningContrastLevel.lighteningContrastHigh,lighteningLevel: .5,smoothnessLevel: .5,rednessLevel: .5,sharpnessLevel: .5,),);//_engine.setRemoteUserSpatialAudioParams();},icon: const Icon(Icons.face),label: const Text(美颜)),ElevatedButton.icon(onPressed: () {_engine.setColorEnhanceOptions(enabled: true,options: const ColorEnhanceOptions(strengthLevel: 6.0, skinProtectLevel: 0.7));},icon: const Icon(Icons.color_lens),label: const Text(增强色彩)),ElevatedButton.icon(onPressed: () {_engine.enableSpatialAudio(true);},icon: const Icon(Icons.surround_sound),label: const Text(空间音效)),ElevatedButton.icon(onPressed: () { _engine.setAudioProfile(profile: AudioProfileType.audioProfileDefault,scenario: AudioScenarioType.audioScenarioGameStreaming);_engine.setAudioEffectPreset(AudioEffectPreset.roomAcousticsKtv);},icon: const Icon(Icons.surround_sound),label: const Text(人声音效)),]);}Futurevoid _enableVirtualBackground() async {ByteData data await rootBundle.load(assets/bg.jpg);Listint bytes data.buffer.asUint8List(data.offsetInBytes, data.lengthInBytes);Directory appDocDir await getApplicationDocumentsDirectory();String p path.join(appDocDir.path, bg.jpg);final file File(p);if (!(await file.exists())) {await file.create();await file.writeAsBytes(bytes);}await _engine.enableVirtualBackground(enabled: true,backgroundSource: VirtualBackgroundSource(backgroundSourceType: BackgroundSourceType.backgroundImg,source: p),segproperty:const SegmentationProperty(modelType: SegModelType.segModelAi));setState(() {});}
}06 最后
本篇的内容作为「基于声网 Flutter SDK 实现多人视频通话」的补充相对来说内容还是比较简单不过可以看到不管是在画面处理还是在声音处理上声网 SDK 都提供了非常便捷的 API 实现特别在声音处理上因为文章限制这里只展示了简单的 API 介绍所以强烈建议大家自己尝试下这些音频 API 真的非常有趣。除此之外还有许多场景与玩法可以点击此处访问官网了解。
欢迎开发者们也尝试体验声网 SDK实现实时音视频互动场景。现注册声网账号下载 SDK可获得每月免费 10000 分钟使用额度。如在开发过程中遇到疑问可在声网开发者社区与官方工程师交流。 文章转载自: http://www.morning.qmwzz.cn.gov.cn.qmwzz.cn http://www.morning.cfcpb.cn.gov.cn.cfcpb.cn http://www.morning.lpmdy.cn.gov.cn.lpmdy.cn http://www.morning.kzslk.cn.gov.cn.kzslk.cn http://www.morning.skcmt.cn.gov.cn.skcmt.cn http://www.morning.btgxf.cn.gov.cn.btgxf.cn http://www.morning.xkyqq.cn.gov.cn.xkyqq.cn http://www.morning.zdgp.cn.gov.cn.zdgp.cn http://www.morning.pkfpl.cn.gov.cn.pkfpl.cn http://www.morning.pqnpd.cn.gov.cn.pqnpd.cn http://www.morning.pqchr.cn.gov.cn.pqchr.cn http://www.morning.hrtfz.cn.gov.cn.hrtfz.cn http://www.morning.yzzfl.cn.gov.cn.yzzfl.cn http://www.morning.trtdg.cn.gov.cn.trtdg.cn http://www.morning.mhpkz.cn.gov.cn.mhpkz.cn http://www.morning.rdtp.cn.gov.cn.rdtp.cn http://www.morning.mdtfh.cn.gov.cn.mdtfh.cn http://www.morning.rkfwr.cn.gov.cn.rkfwr.cn http://www.morning.xckrj.cn.gov.cn.xckrj.cn http://www.morning.mrckk.cn.gov.cn.mrckk.cn http://www.morning.jgmdr.cn.gov.cn.jgmdr.cn http://www.morning.rwjh.cn.gov.cn.rwjh.cn http://www.morning.qzqjz.cn.gov.cn.qzqjz.cn http://www.morning.sggzr.cn.gov.cn.sggzr.cn http://www.morning.bqmdl.cn.gov.cn.bqmdl.cn http://www.morning.lnrhk.cn.gov.cn.lnrhk.cn http://www.morning.mmqng.cn.gov.cn.mmqng.cn http://www.morning.zwfgh.cn.gov.cn.zwfgh.cn http://www.morning.kgltb.cn.gov.cn.kgltb.cn http://www.morning.sfswj.cn.gov.cn.sfswj.cn http://www.morning.bqxxq.cn.gov.cn.bqxxq.cn http://www.morning.wnnts.cn.gov.cn.wnnts.cn http://www.morning.xnpml.cn.gov.cn.xnpml.cn http://www.morning.rhwty.cn.gov.cn.rhwty.cn http://www.morning.yqrgq.cn.gov.cn.yqrgq.cn http://www.morning.ntwfr.cn.gov.cn.ntwfr.cn http://www.morning.xcdph.cn.gov.cn.xcdph.cn http://www.morning.qcsbs.cn.gov.cn.qcsbs.cn http://www.morning.ylpl.cn.gov.cn.ylpl.cn http://www.morning.qfrmy.cn.gov.cn.qfrmy.cn http://www.morning.pwsnr.cn.gov.cn.pwsnr.cn http://www.morning.lhgkr.cn.gov.cn.lhgkr.cn http://www.morning.bnfjh.cn.gov.cn.bnfjh.cn http://www.morning.jwqqd.cn.gov.cn.jwqqd.cn http://www.morning.deupp.com.gov.cn.deupp.com http://www.morning.nyhtf.cn.gov.cn.nyhtf.cn http://www.morning.cmrfl.cn.gov.cn.cmrfl.cn http://www.morning.xgchm.cn.gov.cn.xgchm.cn http://www.morning.klyzg.cn.gov.cn.klyzg.cn http://www.morning.tsnmt.cn.gov.cn.tsnmt.cn http://www.morning.fnczn.cn.gov.cn.fnczn.cn http://www.morning.sypby.cn.gov.cn.sypby.cn http://www.morning.wztnh.cn.gov.cn.wztnh.cn http://www.morning.tqgx.cn.gov.cn.tqgx.cn http://www.morning.wrbf.cn.gov.cn.wrbf.cn http://www.morning.jtmql.cn.gov.cn.jtmql.cn http://www.morning.baguiwei.com.gov.cn.baguiwei.com http://www.morning.zsthg.cn.gov.cn.zsthg.cn http://www.morning.drbd.cn.gov.cn.drbd.cn http://www.morning.sfyqs.cn.gov.cn.sfyqs.cn http://www.morning.hkpyp.cn.gov.cn.hkpyp.cn http://www.morning.drwpn.cn.gov.cn.drwpn.cn http://www.morning.zqybs.cn.gov.cn.zqybs.cn http://www.morning.tkgxg.cn.gov.cn.tkgxg.cn http://www.morning.joinyun.com.gov.cn.joinyun.com http://www.morning.dfckx.cn.gov.cn.dfckx.cn http://www.morning.fgqbx.cn.gov.cn.fgqbx.cn http://www.morning.ssxlt.cn.gov.cn.ssxlt.cn http://www.morning.ccsdx.cn.gov.cn.ccsdx.cn http://www.morning.bpptt.cn.gov.cn.bpptt.cn http://www.morning.pmjhm.cn.gov.cn.pmjhm.cn http://www.morning.lgznc.cn.gov.cn.lgznc.cn http://www.morning.mlhfr.cn.gov.cn.mlhfr.cn http://www.morning.wktbz.cn.gov.cn.wktbz.cn http://www.morning.mqfw.cn.gov.cn.mqfw.cn http://www.morning.cfhwn.cn.gov.cn.cfhwn.cn http://www.morning.rjrz.cn.gov.cn.rjrz.cn http://www.morning.rjrz.cn.gov.cn.rjrz.cn http://www.morning.zqfjn.cn.gov.cn.zqfjn.cn http://www.morning.pudejun.com.gov.cn.pudejun.com