写点什么

聆听极致 ——声网 Agora

用户头像
cv君
关注
发布于: 2021 年 04 月 30 日
聆听极致 ——声网 Agora


我们一直听说声网的存在。cv 君和我的朋友们。

版本 2.4.1 将于 2009 年启动,它将改进和增强监视器和其他任务的可访问性,流媒体服务为此版本提供本地媒体支持,取代实时屏幕上音频和视频的网络连接类型,更改本地视频模式回调,更改流模式回调,更改远程音频连接模式将导致 SDK 和端口服务器的回调、连接和下载丢失,当地时间,整个平台增加了一个组合的 C++接口*,windows 增加了一个 64 位的开发包,windows 是

提供标准文件对话框名称的默认 KDE 文件模块

在一些交互式广播扫描中向参与者发送数据日志可以作为元数据添加到视频帧中,并可以与视频数据的格式相结合

屏幕共享的新参数

版本 2.4,太小,无法共享屏幕。在 2.4.1 上,共享屏幕时是否为用户存储鼠标,如果未在 agorascreen captureparameters 类别中设置,默认情况下,此参数将存储鼠标,即屏幕上的 capturemousecursor 成员

在这里,用户界面的自动化,如正常的鼠标和键盘控制,将发送给您。

美容优化

版本 2.4.1,美观和性能显示太小。

我们为默认参数提供了默认参数,可以同时使用,此版本改进了 beauty 算法的性能,并向以下存档报告不同程度的 GPU 使用率、CPU 使用率和功耗

我们缺少这个功能,因为一些信息和计算机已经被算法和歌曲算法以及大型算法和增长算法所使用。你呢

声音和视频延迟

我的延迟问题太大,而且已选定。不同的设备、CPU、GPU 运算符,高 GPU 计算加入了网速等算法,先流后流和气球联系运输,耽误了问题。之后,我超过了

此时的音频类型

它是由过滤器实现的,所以声音网络插件必须在其中https://pub.dev/packages/顶部

整个演示实例非常简单,主要有四个标准文件:视频对象,主页,

1 主页

主页格式太简单。只有两个按钮可用:词汇和视频通话



@override  Widget build(BuildContext context) {    return Scaffold(      body: Center(        child: Row(          crossAxisAlignment: CrossAxisAlignment.start,          mainAxisAlignment: MainAxisAlignment.spaceEvenly,//主轴空白区域均分          children: <Widget>[            //左边的按钮            RaisedButton(              padding: EdgeInsets.all(0),              //点击事件              onPressed: () {                //去往语音页面                onAudio();              },              child: Container(                height: 120,                width: 120,                //装饰                decoration: BoxDecoration(
//渐变色 gradient: const LinearGradient( colors: [Colors.blueAccent, Colors.lightBlueAccent], ), //圆角12度 borderRadius: BorderRadius.circular(12.0)), child: Text( "语音通话", style: TextStyle(color: Colors.white, fontSize: 18.0), ), //文字居中 alignment: Alignment.center, ), shape: new RoundedRectangleBorder( borderRadius: BorderRadius.circular(12.0), ), ), //右边的按钮 RaisedButton( padding: EdgeInsets.all(0), onPressed: () { //去往视频页面 onVideo(); }, child: Container( height: 120, width: 120, //装饰--->渐变 decoration: BoxDecoration( gradient: const LinearGradient( colors: [Colors.blueAccent, Colors.lightBlueAccent], ), //圆角12度 borderRadius: BorderRadius.circular(12.0)), child: Text( "视频通话", style: TextStyle(color: Colors.white, fontSize: 18.0), ), //文字居中 alignment: Alignment.center, ), shape: new RoundedRectangleBorder( borderRadius: BorderRadius.circular(12.0), ), ), ], ), ), ); }
复制代码


  onAudio() async {    SimplePermissions.requestPermission(Permission.RecordAudio)        .then((status_first) {      if (status_first == PermissionStatus.denied) {        //如果拒绝        Toast.show("此功能需要授予录音权限", context,            duration: Toast.LENGTH_SHORT, gravity: Toast.CENTER);      } else if (status_first == PermissionStatus.authorized) {        //如果授权同意 跳转到语音页面        Navigator.push(          context,          MaterialPageRoute(            builder: (context) => new AudioCallPage(                  //频道写死,为了方便体验                  channelName: "122343",                ),          ),        );      }    });  }
复制代码


   onVideo() async {    SimplePermissions.requestPermission(Permission.Camera).then((status_first) {      if (status_first == PermissionStatus.denied) {        //如果拒绝        Toast.show("此功能需要授予相机权限", context,            duration: Toast.LENGTH_SHORT, gravity: Toast.CENTER);      } else if (status_first == PermissionStatus.authorized) {        //如果同意        SimplePermissions.requestPermission(Permission.RecordAudio)            .then((status_second) {          if (status_second == PermissionStatus.denied) {            //如果拒绝            Toast.show("此功能需要授予录音权限", context,                duration: Toast.LENGTH_SHORT, gravity: Toast.CENTER);          } else if (status_second == PermissionStatus.authorized) {            //如果授权同意            Navigator.push(              context,              MaterialPageRoute(                builder: (context) => new VideoCallPage(                      //视频房间频道号写死,为了方便体验                      channelName: "122343",                    ),              ),            );          }        });      }    });  }
复制代码


这样首页算完成了。

2.语音页面(AudioCallPage)

这里我只做了一对一语音通话的界面效果,也可以实现多人通话,只是把界面样式改成自己喜欢的样式即可。

2.1.样式

一对一通话的界面类似微信语音通话界面一样,屏幕中间是对方头像(这里我只显示对方用户 ID),底部是菜单栏:是否静音,挂断,是否外放,草图如下:


主要用Stack层叠控件+Positioned来定位:


  @override  Widget build(BuildContext context) {    return new Scaffold(      appBar: new AppBar(        title: Text(widget.channelName),      ),      //背景黑色      backgroundColor: Colors.black,      body: new Center(        child: Stack(          children: <Widget>[_viewAudio(), _bottomToolBar()],        ),      ),    );  }
复制代码

主页已完成。

2 音频呼叫页

在这个地方,我们只有一个语音通话接口,我们可以找到更多的私人通话

2.1.风格

其中一个通话界面与微信界面相同,屏幕上对方的可用性(只有对方的用户名可用)显示、隐藏和菜单

这将被堆栈控件+位置替换

2.2.逻辑

有五个主要的显示器来检测这个词

起动发动机

启用音频模块

创建文件室

设置事件监视(已成功添加、已添加到用户、已添加)

布局应用程序

退出声音(使用引擎并释放必要的资源)

2.2.1.起动发动机

起动发动机只有一个代码:


    //初始化引擎    AgoraRtcEngine.create(agore_appId);
复制代码
2.2.2.启用 音 频模 块

启用 音频模 块:


    //设置视频为可用 启用音频模块    AgoraRtcEngine.enableAudio();
复制代码


看官方 档介绍:


2.2.3.加入房间

当初始化完引擎和启用音频模块后,下面进行创建房间:


  //创建渲染视图  void _createRendererView(int uid) {    //增加音频会话对象 为了音频布局需要(通过uid和容器信息)    //加入频道 第一个参数是 token 第二个是频道id 第三个参数 频道信息 一般为空 第四个 用户id    setState(() {      AgoraRtcEngine.joinChannel(null, widget.channelName, null, uid);    });
VideoUserSession videoUserSession = VideoUserSession(uid); _userSessions.add(videoUserSession); print("集合大小"+_userSessions.length.toString()); }
复制代码


主要看这个方法:


第一个参数是服务器创建的令牌,第二个参数是字数,第三个参数是通道数据,使用了四个参数,管理视频用户的用户信息

2.2.4.设置事件控件

当新用户添加、退出或转储用户时,会进行回复

  //设置事件监听  void setAgoreEventListener() {    //成功加入房间    AgoraRtcEngine.onJoinChannelSuccess =        (String channel, int uid, int elapsed) {      print("成功加入房间,频道号:${channel}+uid+${uid}");    };
//监听是否有新用户加入 AgoraRtcEngine.onUserJoined = (int uid, int elapsed) { print("新用户所加入的id为:$uid");
setState(() { //更新UI布局 _createRendererView(uid); self_uid = uid; }); };
//监听用户是否离开这个房间 AgoraRtcEngine.onUserOffline = (int uid, int reason) { print("用户离开的id为:$uid"); setState(() { //移除用户 更新UI布局 _removeRenderView(uid); }); };
//监听用户是否离开这个频道 AgoraRtcEngine.onLeaveChannel = () { print("用户离开"); }; }
复制代码

  //音频布局视图布局  Widget _viewAudio() {    //先获取音频人数    List<int> views = _getRenderViews();    switch (views.length) {      //只有一个用户(即自己)      case 1:        return Center(          child: Container(            child: Text("用户1"),          ),        );      //两个用户      case 2:        return Positioned(//在中间显示对方id          top: 180,          left: 30,          right: 30,          child: Container(            height: 260,            child: Column(              mainAxisAlignment: MainAxisAlignment.spaceBetween,              crossAxisAlignment: CrossAxisAlignment.center,              children: <Widget>[                ClipRRect(                  borderRadius: BorderRadius.circular(10),                  child: Container(                    alignment: Alignment.center,                    width: 140,                    height: 140,                    color: Colors.red,                    child: Text("对方用户uid:\n${self_uid}",                      textAlign: TextAlign.center,
style: TextStyle(color: Colors.white), ), ), ), ], ), ), );
default: } return new Container(); }
复制代码


2.2.6.退出语音


  //本页面即将销毁  @override    void dispose() {    //把集合清掉    _userSessions.clear();    AgoraRtcEngine.leaveChannel();    //sdk资源释放    AgoraRtcEngine.destroy();    super.dispose();  }
复制代码


  //移除对应的用户界面 并且移除用户会话对象  void _removeRenderView(int uid) {    //先从会话对象根据uid来清除    VideoUserSession videoUserSession = _getVideoUidSession(uid);
if (videoUserSession != null) { _userSessions.remove(videoUserSession); } }
复制代码
2.2.7.是否静音


  //开关本地音频发送  void _isMute() {    setState(() {      muted = !muted;    });    // true:麦克风静音 false:取消静音(默认)    AgoraRtcEngine.muteLocalAudioStream(muted);  }
复制代码
2.2.8.是否开扬声器
  //是否开启扬声器  void _isSpeakPhone() {    setState(() {      speakPhone = !speakPhone;    });    AgoraRtcEngine.setEnableSpeakerphone(speakPhone);  }
复制代码

2.3.最终效果


因为这是 GIF,所以你听不到。解决问题了。

您需要连接到来自两方的呼叫才能进入呼叫接口

拆下一侧时,必须拆下另一侧

例如,已从网络中提取 CV

3.1.启用视频

主代码是 agorartceengine.Enablevideo(;,查看文档:

可以在加入通道或调用之前调用此方法。

3.2 创建视频渲染视图

创建视频播放器插件:


以视频格式通过存储器存储和管理会话对象

3.3.设置本地视图

将本地视频视图设置为本地设备


创建和视频渲染模式。

3.4.禁用视频预览

在连接频道之前,将启动本地视频预览。您可能需要在调用之前调用此方法

3.5.添加到频道

一切就绪后,您必须将其添加到视频室。将声音添加到视频室


3.6.设置事件监视

视频和声音事件的最大视频大小

必须在用户添加的回调方法中调用此方法


//设置事件监听  void setAgoreEventListener(){    //成功加入房间    AgoraRtcEngine.onJoinChannelSuccess = (String channel,int uid,int elapsed){      print("成功加入房间,频道号:$channel");    };
//监听是否有新用户加入 AgoraRtcEngine.onUserJoined = (int uid,int elapsed){ print("新用户所加入的id为:$uid"); setState(() { _createDrawView(uid, (viewId){ //设置远程用户的视频视图
AgoraRtcEngine.setupRemoteVideo(viewId, VideoRenderMode.Hidden, uid); }); });
};
//监听用户是否离开这个房间 AgoraRtcEngine.onUserOffline = (int uid,int reason){ print("用户离开的id为:$uid"); setState(() { _removeRenderView(uid); });
};
//监听用户是否离开这个频道 AgoraRtcEngine.onLeaveChannel = (){ print("用户离开"); };
}
复制代码

3.7.布局实现

这里要分情况,1-5 各用户的情况:


//视频视图布局  Widget _videoLayout(){    //先获取视频试图个数    List<Widget> views = _getRenderViews();
switch(views.length){ //只有一个用户的时候 整个屏幕 case 1: return new Container( child: new Column( children: <Widget>[ _videoView(views[0]) ], ), );
//两个用户的时候 上下布局 自己在上面 对方在下面 case 2: return new Container( child: new Column( children: <Widget>[ _createVideoRow([views[0]]), _createVideoRow([views[1]]), ], ), );
//三个用户 case 3: return new Container( child: new Column( children: <Widget>[ //截取0-2 不包括2 上面一列两个 下面一个 _createVideoRow(views.sublist(0, 2)),
//截取2 -3 不包括3 _createVideoRow(views.sublist(2, 3)) ], ), );
//四个用户 case 4: return new Container( child: new Column( children: <Widget>[ //截取0-2 不包括2 也就是0,1 上面 下面各两个用户 _createVideoRow(views.sublist(0, 2)),
//截取2-4 不包括4 也就是 3,4 _createVideoRow(views.sublist(2, 4)) ], ), ); default: } return new Container(); }
复制代码


最 核心的就是,有用户 退出和加 入就要更新 UI 视图。

3.8.最终效果


最终效果如上图,前后摄像头切换,挂断和静音的功能效果没录进去

游戏的通话解决方案

确认玩家是否真的可以调用玩家、组操作、可访问性

解决当前游戏的词汇有问题吗?

1 第三方呼叫应用程序

这个程序的发布是希望它会有用,但是没有任何保证;甚至没有对适销性或特定用途的适用性的暗示保证。有关更多详细信息,请参阅 GNU 通用公共许可证。

音效和音量不能由一个标准来控制,根本不能添加

应用程序正在后台运行,现在将自动退出或删除它。

高性能要求的手机,易于使用,hotphone

2 声音功能已添加到游戏应用程序中。

存在以下问题:

编辑问题的游戏声音,或其声音

如何操作 now.io

1 播放并将数据保存为文件或传送给播放器,然后创建一个闭环。

2 编码和解码。仅仅存储和游戏是不够的。数据的大小太大。要压缩数据,我们需要添加编码和解码你必须这样。我们需要收集和压缩数据

三。网络部分。接收和接收,anm(音频网络模块),我会叫它第三站

4 前一步和后一步的一部分。这会导致卡片关闭,音频过程是过程的一部分。此模块使用 3A 引擎值:回声消除 AEC、增益控制 AGC、噪声抑制 ANS。


数以百计的模型已经被改编,而我们的第四代“免费”适配技术保证了我们可以适配 4000 款车型。

这个时间的“免费”扩展是免费的,它允许自由编辑和同时编辑,应用模型的特殊效果。模型不匹配,公共版本算法,基本上,没什么大问题。图像的总图像,在两分钟内,是图像的最大高度会有声音。如果你想更新你的手机,为了一个独特的型号,测试方法已全部设置为现在测试;下一行将从联机信息开始,以确定“不更改”对模型的影响回复回复,结果是“免费”编辑

摘要

CV Jun 不了解完整的升级。一些常见的功能可以根据指定的文档进行识别。

声音、视频效果正确。

开发人员可以使用说明和文档

中国有一家公司,但它还是太长了。对于算法问题,它太长了。

发布于: 2021 年 04 月 30 日阅读数: 321
用户头像

cv君

关注

还未添加个人签名 2021.03.22 加入

还未添加个人简介

评论 (57 条评论)

发布
用户头像
👍
2021 年 05 月 08 日 12:17
回复
感谢大佬哦,哈哈哈
2021 年 05 月 09 日 09:39
回复
用户头像
大佬就是强啊
2021 年 05 月 07 日 20:51
回复
过奖
2021 年 05 月 09 日 09:39
回复
用户头像
厉害👍🏻
2021 年 05 月 07 日 07:37
回复
老哥也ok
2021 年 05 月 09 日 09:39
回复
用户头像
厉害厉害
2021 年 05 月 07 日 07:34
回复
嗯呐
2021 年 05 月 09 日 09:39
回复
用户头像
厉害!!!
2021 年 05 月 06 日 22:50
回复
牛蛙
2021 年 05 月 09 日 09:39
回复
用户头像
真牛
2021 年 05 月 06 日 22:49
回复
加油
2021 年 05 月 09 日 09:39
回复
用户头像
加油,我支持你的,佩服
2021 年 05 月 06 日 22:49
回复
okk
2021 年 05 月 09 日 09:39
回复
用户头像
不错
2021 年 05 月 06 日 22:49
回复
回复不过来了,说声谢谢吧
2021 年 05 月 09 日 09:40
回复
用户头像
不错
2021 年 05 月 06 日 22:49
回复
回复不过来了,说声谢谢吧
2021 年 05 月 09 日 09:40
回复
用户头像
很好
2021 年 05 月 06 日 22:49
回复
回复不过来了,说声谢谢吧
2021 年 05 月 09 日 09:40
回复
用户头像
厉害/牛牛
2021 年 05 月 06 日 22:49
回复
回复不过来了,说声谢谢吧
2021 年 05 月 09 日 09:40
回复
用户头像
666
2021 年 05 月 06 日 22:49
回复
我也喜欢说666
2021 年 05 月 09 日 09:40
回复
用户头像
加油哦
2021 年 05 月 06 日 22:49
回复
2021 年 05 月 09 日 09:40
回复
用户头像
太牛了!
2021 年 05 月 06 日 22:49
回复
厉害
2021 年 05 月 09 日 09:40
回复
用户头像
很好
2021 年 05 月 06 日 22:48
回复
ok
2021 年 05 月 09 日 09:40
回复
用户头像
很好
2021 年 05 月 06 日 22:48
回复
ok
2021 年 05 月 09 日 09:40
回复
用户头像
我最佩服有才华的人,加油
2021 年 05 月 06 日 22:48
回复
2021 年 05 月 09 日 09:40
回复
用户头像
厉害厉害
2021 年 05 月 06 日 22:48
回复
2021 年 05 月 09 日 09:40
回复
用户头像
加油
2021 年 05 月 06 日 22:48
回复
用户头像
不错哦
2021 年 05 月 06 日 22:48
回复
加载更多
聆听极致 ——声网 Agora