Android端实时音视频开发指南

简介

yun2win-sdk-Android提供Android端实时音视频完整解决方案,方便客户快速集成实时音视频功能. SDK 提供的能力如下:

  • 发起
  • 加入
  • AVClient
  • Channel
  • AVMember

 

开发准备

  • 注册并创建应用
  • 到 github下载yun2winSDK及demo
  • 下载源码详解

    app为主体显示Module uikit为公共服务Module

    app下libs的yun2win-av-0.1.jar为音视频,屏幕共享SDK

    主体Module结构图

    base文件夹:app初始相关类

    Bridge文件夹:推送连接、接收和发送

    common文件夹:公共配置等

    db文件夹:数据库管理

    entities文件夹:实体集合

    manage文件夹:模型实体管理

    model文件夹:模型集合

    service文件夹:服务管理

    ui文件夹:界面相关

  • 配置信息

    在清单文件AndroidManifest.xml里加入以下权限,以及写上你注册的appkey

    权限配置(实际开发中可能需要更多的权限,可参考demo):

    复制
       
    <?xml version="1.0" encoding="utf-8" ?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.yun2win.demo"> <!-- 加入应用需要的权限 --> <!-- 网络相关 --> <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" /> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> <uses-permission android:name="android.permission.WRITE_SETTINGS" /> <!-- 手机状态 --> <uses-permission android:name="android.permission.GET_TASKS" /> <uses-permission android:name="android.permission.FLASHLIGHT" /> <uses-permission android:name="android.permission.VIBRATE" /> <uses-permission android:name="android.permission.WAKE_LOCK" /> <uses-permission android:name="android.permission.BLUETOOTH" /> <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" /> <uses-permission android:name="android.permission.CHANGE_CONFIGURATION" /> <uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" /> <!-- 读写文件 --> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <!-- 多媒体 --> <uses-permission android:name="android.permission.CAMERA" /> <uses-permission android:name="android.permission.RECORD_AUDIO" /> <uses-permission android:name="android.permission.READ_PHONE_STATE" /> <application android:name="y2w.base.AppContext" android:allowbackup="true" android:icon="@drawable/lyy_icon" android:label="@string/app_name" android:theme="@style/AppTheme"> <!-- 设置yun2win应用的appkey --> <meta-data android:name="YUN2WIN_APP_KEY" android:value="CerAgk970T8MlUmz" /> </application> </manifest>

    关于YUN2WIN_APP_KEY对应的value获取,在创建应用后,申请APPKEY并进行相关配置。

  • app打包混淆

    在proguard文件中加入以下keep

    -keep class com.yun2win.** {*;}

    -dontwarn com.yun2win.**

初始化

将以下代码复制到项目Application类onCreate()中

复制

AVClient.init(this);

发起

调用以下代码创建频道:

复制

private void createChannel(){ avClient = new AVClient(currentUser.getEntity().getId(), currentUser.getEntity().getName(), currentUser.getEntity().getAvatarUrl(),currentUser.getImToken().getAccessToken()); //创建频道 avClient.createChannel(new AVBack.Result() { @Override public void onSuccess(Channel channel) { avChannel = channel; avChannel.setOnMembersChangedListener(new MembersChangedListener()); avChannel.setOnVideoListener(new VideoListener()); avChannel.setOnAudioListener(new AudioListener()); avChannel.setOnScreenListener(new ScreenListener()); avChannel.join();//加入通知 memberNotice(memberIds); if(callType.equals(EnumManage.AvCallType.video.toString())){ handler.sendEmptyMessage(Oper.OpenVideo); handler.sendEmptyMessage(Oper.OpenAudio); }else{ handler.sendEmptyMessage(Oper.OpenAudio); } } @Override public void onError(Integer integer) { noticeShow("创建频道失败"); } }); }

加入

调用以下代码加入频道:

复制
private void getChannel(String channelId){ avClient = new AVClient(currentUser.getEntity().getId(),currentUser.getEntity().getName(), currentUser.getEntity().getAvatarUrl(), currentUser.getImToken().getAccessToken()); //获取频道 avClient.getChannel(channelId, new AVBack.Result() { @Override public void onSuccess(Channel channel) { avChannel = channel; avChannel.setOnMembersChangedListener(new MembersChangedListener()); avChannel.setOnVideoListener(new VideoListener()); avChannel.setOnAudioListener(new AudioListener()); avChannel.setOnScreenListener(new ScreenListener()); avChannel.join();//加入通知 if (callType.equals(EnumManage.AvCallType.video.toString())) { handler.sendEmptyMessage(Oper.OpenVideo); handler.sendEmptyMessage(Oper.OpenAudio); } else { handler.sendEmptyMessage(Oper.OpenAudio); } } @Override public void onError(Integer integer) { noticeShow("获取频道失败"); } }); }

提醒

加入方法必须填入需要加入的channelId。

Channel

频道类:主要方法,其他查看API手册

复制
join()
加入频道 void leave() 离开频道 void openAudio() 开启语音 void openVideo() 开启视频 void setMute(boolean mute) 设置静音 void setOnAudioListener(Channel.OnAudioListener onAudioListener) 设置音频监听 void setOnMembersChangedListener(Channel.OnMembersChangedListener onMembersChangedListener) 设置成员变更监听 void setOnScreenListener(Channel.OnScreenListener onScreenListener) 设置屏幕共享监听 void setOnVideoListener(Channel.OnVideoListener onVideoListener) 设置视频监听 void setSpeaker(boolean speaker) 设置扬声器 void switchCamera() 转摄像头

AVMember

频道成员类:主要方法,其他查看API手册

复制
org.webrtc.VideoTrack getScreenTrack() 获取屏幕共享流 java.lang.String getUid() 获取成员唯一标识码 org.webrtc.VideoTrack getVideoTrack() 获取视频流 boolean isAudioMuted() 是否开启静音 boolean isAudioOpened() 是否开启语音 boolean isScreenOpened() 是否开屏幕共享 boolean isVideoOpened() 是否开启视频 void setAudioMuted(boolean audioMuted) 设置是否静音 void setAudioOpened(boolean audioOpened) 设置是否开启语音 void setScreenOpened(boolean screenOpened) 设置屏幕共享 void setScreenTrack(org.webrtc.VideoTrack screenTrack) 设置屏幕共享流 void setUid(java.lang.String uid) 设置成员唯一标识码 void setVideoOpened(boolean videoOpened) 设置是否开启视频 void setVideoTrack(org.webrtc.VideoTrack videoTrack) 设置视频流 从类继承的方法 java.lang.Object

注意事项

复制

1.创建或者获取Channel对象后,都需要调用join方法加入频道进行实时通讯. 2.为确保接收到所有回调,设置相应监听应该在调用join方法之前. 3.SDK不会自动开启音频视频屏幕共享和白板功能,开发时根据需求调用各功能. 4.屏幕共享功能在移动端暂时不能主动发起.

用户手册

AVSDK手册

 

 

转载于:https://www.cnblogs.com/yun2win/p/5780872.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/430259.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何设置照片的高度没有滚条_基金定投选几只合适,如何设置止盈止损,有没有好的组合推荐?...

【自荐】萌萌的猪猪侠&#xff1a;一个用自己的语言&#xff0c;自己的感受&#xff0c;自己的实盘分享投资理财的自媒体。【说会话】山色空蒙雨亦奇。住在山脚下就能看到这样美丽的景色。这或许是最近比较好的风景呢。昨天看朋友的朋友圈&#xff0c;朋友的父母没有抗过新冠肺…

渗透测试流程(单台服务器)

渗透测试流程&#xff08;单台服务器&#xff09; 转载于:https://www.cnblogs.com/sky--/p/5781432.html

Redis windows学习(一)——redis安装和基础使用

前言 最近做项目时&#xff0c;打算用Redis做缓存服务器&#xff0c;于是研究了一下Redis。由于项目是在windows下&#xff0c;也不打算开个虚拟机&#xff0c;所以就直接安装在windows下。虽然&#xff0c;Redis官网并不提供windows版本&#xff0c;但还是指明了可以在微软开…

button 隐藏属性_PyQt5实现仿QQ贴边隐藏功能!有点意思

此程序大致功能为&#xff1a;可变换颜色&#xff0c;贴边隐藏。变换颜色思路QPalette( [ˈplət] 调色板)类相当于对话框或控件的调色板&#xff0c;它管理着控件或窗体的所有颜色信息&#xff0c;每个窗体或控件都包含一个QPalette对象&#xff0c;在显示时按照它的QPalette对…

query的list()和iterate()区别 面试题

query的list()和iterate()区别 1.返回的类型不一样&#xff0c;list返回List&#xff0c;iterate返回iterator 2.查询策略不同。 获取数据的方式不一样&#xff0c;list会直接查询数据库&#xff0c;iterate会先到数据库中把id取出来&#xff0c;然后真正要遍历某个对象的时候…

java+eclipse+selenium环境搭建

这几天在学selenium&#xff0c;大头虾的我。安装环境还是遇到了挺多问题&#xff0c;赶紧来记录下。不然下次又。。。&#xff08;参考虫师的《Selenium2 Java自动化测试实战》&#xff09;&#xff0c;就随便写写加深下自己的印象。 1、安装java 访问java官网下载jdk http://…

unity socket传输图片_python3实现socket传输图片

我最近在做一个项目的时候需要把树莓派上的摄像头拍摄的图片实时传输到我的PC上我想通过socket完成这个功能我找了找网上的代码&#xff0c;好多都是python2.x版本的&#xff0c;或者是图片总是传不过来的&#xff0c;只能自己写了一个我先附上我的源代码&#xff0c;再来聊一聊…

python 对象_Python中的Barrier对象

python中的Barrier对象用于等待固定数量的线程完成执行&#xff0c;然后任何特定线程才能继续执行程序。每个线程在到达Barrier时都调用wait()函数。Barrier负责跟踪wait()调用的数量。如果该数目超出了为其初始化Barrier的线程数&#xff0c;则Barrier为等待线程提供了一种继续…

AE CreateFeatureClass 创建shp. 删除shp. 向shp中添加要素

/// <summary>/// 创建多边形shp/// </summary>/// <param name"pPolygon"></param>/// <param name"shpPath"></param>public static void CreatePolygonFeatureClass(IPolygon pPolygon, string shpfolder,string …

aes密文长度_RSA加密密文可变(一句话说明)

先来看一个搜索结果&#xff1a;RSA算法本质上是基于数学【对极大整数做因数分解的难度】的原理&#xff0c;so 密文本质上是一堆有规则的数字经过编码和【填充】的结果。原文和加密密钥相同&#xff0c;在java环境&#xff0c;默认Padding模式下每次生成的密文是相同的&#x…

网络分析之networkx(转载)

图的类型 Graph类是无向图的基类&#xff0c;无向图能有自己的属性或参数&#xff0c;不包含重边&#xff0c;允许有回路&#xff0c;节点可以是任何hash的python对象&#xff0c;节点和边可以保存key/value属性对。该类的构造函数为Graph(dataNone&#xff0c;**attr)&#xf…

sqlite管理工具_Liquibase 数据库版本管理工具:1.安装

1.Liquibase 是什么粘一段官方的解释Track, version, and deploy database changes跟踪、管理和应用数据库变化说白了&#xff0c;就是一个将你的数据库脚本转化为xml格式保存起来。其中包含了你对数据库的改变&#xff0c;以及数据库的版本信息&#xff0c;方便数据的升级和回…

BZOJ2720: [Violet 5]列队春游

2720: [Violet 5]列队春游 Time Limit: 5 Sec Memory Limit: 128 MBSubmit: 173 Solved: 125[Submit][Status][Discuss]Description Input Output Sample Input Sample Output HINT 题解&#xff1a;对于这种题目我只能呵呵一笑欺负我是单身汪&#xff0c;哎&#xff01; 一、…

面向对象(二)——三大特性(封装、继承、多态)

一、封装 目的&#xff1a;保护类&#xff0c;让类更加安全。 做法&#xff1a;让类里面的成员变量变为私有&#xff08;即访问修饰符&#xff09;的&#xff0c;做相应的方法或者属性去间接的操作成员变量 ※访问修饰符 private 私有的 只能在该类中访问 protec…

伸展树的代码实现

一、伸展树的数据结构 typedef struct Node {int key; struct Node *lch,*rch,*parent; }* Node ,* Tree; 二、伸展树的基础操作 下面几个函数中&#xff0c;设x 的父节点为 p, p的父节点为g 。 zig( t , x ) 右旋。当p是根节点&#xff0c;x是p的左孩子&#xff0c;将…

枚举命名规范_UE4 C++基础教程 - 编码规范

为什么要学习编码规范&#xff1f;良好的编码规范不仅利于项目维护&#xff0c;也增加了代码辨识度。使我们在阅读代码时能够更加清晰的理解代码意图。维护编码规范不是一件机械化的工作&#xff0c;它更像是一门艺术&#xff0c;让我们在有限的规范内发挥自己的创造力。除此之…

Cocos2d-x之Log输出机制

| 版权声明&#xff1a;本文为博主原创文章&#xff0c;未经博主允许不得转载。 在cocos2d-x中&#xff0c;我们使用log这个函数进行输出&#xff0c;log可以输出很多参数&#xff0c;它的使用方式就和使用c语言中的printf的使用方式差不多。log其实是一个跨平台的日志输出的…

python接口测试jason_Python 接口测试之Json数据文件操作

引言 前面说过接口测试就是数据的测试&#xff0c;在测试之前&#xff0c;需要准备好测试数据&#xff0c;而测试数据可以用数据库、excel、txt和csv方式&#xff0c;当然还有一种方式&#xff0c;那就是使用json文件来储存测试数据。常用的方式就是这些。 设计思路 python读取…

城市轮廓线求解

问题描述 每一个建筑物用一个三元组表示(L, H, R), 表示左边界, 高度和右边界,轮廓线用X,Y,X,Y…这样的交替式表示,给N个建筑&#xff0c;求轮廓线。 总体思路 首先&#xff0c;要将建筑物离散成点或线&#xff0c;方便运算。将建筑物表示成&#xff08;L,H&#xff09;,(R,…

wpf的listbox循环数据滚动_滚动版 CentOS Stream 和 Fedora 的关系

如果 CentOS 现在位于 RHEL 的上游&#xff0c;那么 Fedora 会发生什么&#xff1f;那不是 Fedora 在 Red Hat 生态系统中的角色吗&#xff1f;-- Matthew Miller&#xff08;作者&#xff09;一封来自 Fedora 项目负责人办公室的信件&#xff1a;&#xff08;LCTT 译注&#x…