1. 简介
2. 账户注册与项目创建
3. SDK 下载与集成
dependencies {
implementation
'io.agora.rtc:full-sdk:3.1.3'
}
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
}
4. 应用开发
https://github.com/glumes/agora-sdk-demo
4.1 权限申请
<manifest xmlns:android=
"http://schemas.android.com/apk/res/android"
package=
"io.agora.tutorials1v1acall">
<uses-permission android:name=
"android.permission.READ_PHONE_STATE" />
<uses-permission android:name=
"android.permission.INTERNET" />
<uses-permission android:name=
"android.permission.RECORD_AUDIO" />
<uses-permission android:name=
"android.permission.CAMERA" />
<uses-permission android:name=
"android.permission.MODIFY_AUDIO_SETTINGS" />
<uses-permission android:name=
"android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name=
"android.permission.BLUETOOTH" />
<uses-permission android:name=
"android.permission.ACCESS_WIFI_STATE" />
// 如果你的场景中涉及读取外部存储,需添加如下权限:
<uses-permission android:name=
"android.permission.READ_EXTERNAL_STORAGE" />
// 如果你使用的是 Android 10.0 及以上设备,还需要添加如下权限:
<uses-permission android:name=
"android.permission.READ_PRIVILEGED_PHONE_STATE" />
...
</manifest>
4.2 引擎创建
// 声明 RtcEngine
private RtcEngine mRtcEngine;
// 创建 RtcEngine
private void initializeEngine() {
try {
mRtcEngine = RtcEngine.create(getBaseContext(), getString(R.
string.agora_app_id), mRtcEventHandler);
}
catch (Exception e) {
Log.e(TAG, Log.getStackTraceString(e));
throw
new RuntimeException(
"NEED TO check rtc sdk init fatal error\n" + Log.getStackTraceString(e));
}
}
mRtcEventHandler
,它是一个
IRtcEngineEventHandler
类型的抽象类,类里面定义了很多方法,去响应 RtcEngine 不同状态的回调,比如连接成功,连接失败、加入频道、离开频道、网络状态改变等等。如果有需要对应用的性能做一些监视,那么就可以在 IRtcEngineEventHandler 的回调方法做相关统计和埋点。
4.3 实现 Camera 画面预览
4.3.1 创建 Camera 画面预览控件 View
// 使用 SurfaceView 的场景
SurfaceView mLocalView = RtcEngine.CreateRendererView(getBaseContext());
// 使用 TextureView 的场景
TextureView mLocalView = RtcEngine.CreateTextureView(getBaseContext());
4.3.2 配置 Camera 输出并开启预览
// 开启视频
mRtcEngine.enableVideo();
// 初始化本地视图
mRtcEngine.setupLocalVideo(
new VideoCanvas(mLocalView, VideoCanvas.RENDER_MODE_HIDDEN,
0));
// 开启预览
mRtcEngine.startPreview();
// VideoCanvas 构造函数类型
VideoCanvas (View view)
VideoCanvas (View view,
int renderMode,
int uid)
VideoCanvas (View view,
int renderMode, String channelId,
int uid)
VideoCanvas (View view,
int renderMode,
int uid,
int mirrorMode)
VideoCanvas (View view,
int renderMode, String channelId,
int uid,
int mirrorMode)
-
RENDER_MODE_HIDDEN -
优先保证视窗被填满。视频尺寸等比缩放,直至整个视窗被视频填满。如果视频长宽与显示窗口不同,多出的视频将被截掉。 -
RENDER_MODE_FIT -
优先保证视频内容全部显示。视频尺寸等比缩放,直至视频窗口的一边与视窗边框对齐。如果视频长宽与显示窗口不同,视窗上未被填满的区域将被涂黑 -
RENDER_MODE_FILL -
视频尺寸进行缩放和拉伸以充满显示视窗
4.3.3 Camera 更多的配置操作
// 配置 Camera 信息
mRtcEngine.setCameraCapturerConfiguration(
new CameraCapturerConfiguration(CAPTURER_OUTPUT_PREFERENCE_AUTO,CAMERA_FRONT));
-
CAPTURER_OUTPUT_PREFERENCE_AUTO
-
(默认)自动调整采集参数。 -
CAPTURER_OUTPUT_PREFERENCE_PERFORMANCE
-
优先保证设备性能。 -
CAPTURER_OUTPUT_PREFERENCE_PREVIEW
-
优先保证视频预览质量。
4.4 加入通话频道
// 函数原型
joinChannel ( String token,String channelName,String optionalInfo,
int optionalUid)
// 具体调用
private void joinChannel() {
// 得到 Token
String token = getString(R.
string.agora_access_token);
// Token 和 频道名要匹配
mRtcEngine.joinChannel(token,
"demoChannel1",
"",
0);
}
joinChannel
方法加入,其中 token 就是我们之前创建好的,而频道名称也是创建 token 时指定的,这两者要匹配起来。optionalInfo 是可选的字符串。optionalUid 是用户 ID,也是可选项,如果不指定(设为 0),SDK 会自动分配一个,并在 onJoinChannelSuccess 回调方法中返回。
leaveChannel
方法,我们可以离开当前频道,同样会回调 IRtcEngineEventHandler 中的 onLeaveChannel 方法。
4.5 音视频数据编码格式参数设置
注意:音频和视频的参数都一定要在加入频道前设定好,也就是 joinChannel 方法调用之前,在其之后调用是不生效的。
4.5.1 视频编码参数设置
setVideoEncoderConfiguration
方法。
mRtcEngine.setVideoEncoderConfiguration(
new VideoEncoderConfiguration(
// 视频分辨率
VideoEncoderConfiguration.VD_640x360,
// 帧率
VideoEncoderConfiguration.FRAME_RATE.FRAME_RATE_FPS_15,
// 码率
VideoEncoderConfiguration.STANDARD_BITRATE,
// 视频方向
VideoEncoderConfiguration.ORIENTATION_MODE.ORIENTATION_MODE_FIXED_PORTRAIT));
4.5.2 音频编码参数设置
setAudioProfile
方法来设置。
mRtcEngine.setAudioProfile(
// 设置音频采样率、码率、编码模式和声道数
Constants.AudioProfile.DEFAULT.ordinal(),
// 设置音频的应用场景
Constants.AudioScenario.DEFAULT.ordinal());
-
DEFAULT
-
通信场景下,该选项代表指定 32 kHz 采样率,语音编码,单声道,编码码率最大值为 18 Kbps。 -
直播场景下,该选项代表指定 48 kHz 采样率,音乐编码,单声道,编码码率最大值为 64 Kbps。 -
SPEECH_STANDARD
-
指定 32 kHz 采样率,语音编码, 单声道,编码码率最大值为 18 Kbps。 -
MUSIC_STANDARD_STEREO
-
指定 48 kHz 采样率,音乐编码, 单声道,编码码率最大值为 64 Kbps。 -
MUSIC_HIGH_QUALITY
-
指定 48 kHz 采样率,音乐编码, 单声道,编码码率最大值为 96 Kbps。 -
MUSIC_HIGH_QUALITY_STEREO
-
指定 48 kHz 采样率,音乐编码, 双声道,编码码率最大值为 128 Kbps。
-
DEFAULT
-
默认的音频应用场景 -
CHATROOM_ENTERTAINMENT
-
娱乐应用,需要频繁上下麦的场景 -
EDUCATION
-
教育应用,流畅度和稳定性优先 -
GAME_STREAMING
-
高音质语聊房应用 -
SHOWROOM
-
秀场应用,音质优先和更好的专业外设支持 -
CHATROOM_GAMING
-
游戏开黑
4.6 用户加入并显示对方画面
4.6.1 判断是否有用户加入频道
-
REMOTE_VIDEO_STATE_STARTING
-
本地用户已接收远端视频首包 -
REMOTE_VIDEO_STATE_DECODING
-
远端视频流正在解码,正常播放 -
REMOTE_VIDEO_STATE_STOPPED
-
远端视频默认初始状态 -
REMOTE_VIDEO_STATE_FROZEN
-
远端视频流卡顿 -
REMOTE_VIDEO_STATE_FAILED
-
远端视频流播放失败
@
Override
public void onRemoteVideoStateChanged(final int uid, int state, int reason, int elapsed) {
if (state == Constants.REMOTE_VIDEO_STATE_STARTING){
runOnUiThread(
new Runnable() {
@Override
public
void run() {
setupRemoteVideo(uid);
}
});
}
}
4.6.2 建立远端用户视图
// 由 Agora SDK 创建 SurfaceView
mRemoteView = RtcEngine.CreateRendererView(getBaseContext());
// 把 SurfaceView 添加到当前 Activity 的布局控件树上
mRemoteContainer.addView(mRemoteView);
// Camera 画面预览就用 setupLocalVideo 方法,远端用户就用 setupRemoteVideo 方法
mRtcEngine.setupRemoteVideo(
new VideoCanvas(mRemoteView, VideoCanvas.RENDER_MODE_HIDDEN, uid));
4.7 应用运行并视频通话
5. 项目开发总结
SDK 集成 -> 权限设置 -> Camera 预览 -> 加入频道 -> 显示画面 -> 在线通话
本文分享自微信公众号 - TXP嵌入式(txp1121518wo-)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。