# 直播加速快速入门
此集成文档基于三体云 SDK 2.9.6 版本,方便您快速集成和使用 SDK 基本功能。
# Demo体验
Demo, 按照文档说明运行demo
# 开发环境
- Android Studio 3.0 或以上版本
- Android SDK API 等级 18 或以上
- 支持 Android 4.3 或以上版本的移动设备
- Java SDK 8.0 或以上版本
注册三体云账号,申请AppId
# 下载 SDK
前往 SDK 下载页面,获取最新版的三体云 SDK,然后解压。
将 SDK 压缩包解压缩获取 aar 文件,将 aar 引用到项目中:
# 添加项目权限
根据场景需要,在 /app/src/main/AndroidManifest.xml 文件中添加如下行,获取相应的设备权限:
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.tttrtclive.live">
<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" />
// 如果你使用的是 Android 10.0 及以上设备,还需要添加如下权限:
<uses-permission android:name="android.permission.READ_PRIVILEGED_PHONE_STATE" />
...
</manifest>
# 防止代码混淆
在 app/proguard-rules.pro 文件中添加如下行,防止代码混淆:
-keep class ttt.ijk.media.**{*;}
-keep class project.android.imageprocessing.**{*;}
-keep class org.TTTRtc.voiceengine.**{*;}
-keep class com.wushuangtech.**{*;}
-dontwarn ttt.ijk.media.**
# 实现直播加速
# API 调用时序图
# 1.初始化 TTTRtcEngine
在调用其他 API 前,需要创建并初始化 TTTRtcEngine 对象。
调用 create
方法,传入获取到的 App ID,即可初始化 TTTRtcEngine。
在设置 TTTRtcEngineEventHandler 注意:
1.SDK 暂不支持设置多个回调接收对象,后设置的会覆盖前面所设置的。
2.避免在回调线程中做耗时的操作,以防阻塞线程,影响后续回调信令的接收。
TTTRtcEngine mTTTEngine = TTTRtcEngine.create(getApplicationContext(), <APPID>, false, mMyTTTRtcEngineEventHandler);
if (mTTTEngine == null) {
return ;
}
# 2. 设置频道模式
初始化结束后,调用 setChannelProfile
方法,将频道模式设为直播。
该 API 必须在 joinChannel(加入频道) 前设置。
全局性 API,退出频道并不会改变之前所设置的模式。如需切换模式,需要显式的再次调用。
mTTTEngine.setChannelProfile(Constants.CHANNEL_PROFILE_LIVE_BROADCASTING);
# 3. 设置用户角色
直播频道有三种用户角色:主播、副播和观众,其中默认的角色为副播。
主播/副播可以收发音频流,但只有主播可以推送音视频流到CDN,观众只收不发。
全局性 API,退出频道并不会改变之前所设置的角色身份。如需切换角色,需要显式的再次调用。
注意:
1.直播模式下,频道只能由主播先创建(即先joinChannel),其他副播和观众才可以加入此频道,否则会加入失败。
mTTTEngine.setClientRole(Constants.CLIENT_ROLE_ANCHOR); // 角色为主播
# 4. 配置推流地址和参数
// 创建配置对象
PublisherConfiguration publisherConfiguration = new PublisherConfiguration();
// 设置推流地址
publisherConfiguration.setPushUrl(mPushUrl);
// 设置推流视频参数,默认值为352,640,15,500,这里以默认值演示,如果用默认可忽略下面代码。
PublisherConfiguration.VideoMixerParams videoMixerParams = new PublisherConfiguration.VideoMixerParams();
videoMixerParams.mVideoMixerWidth = 352;
videoMixerParams.mVideoMixerHeight = 640;
videoMixerParams.mVideoMixerFps = 15;
videoMixerParams.mVideoMixerBitrate = 500;
videoMixerParams.mVideoMixerHighQualityMode = Constants.VIDEO_SERVER_MIX_MODE_NORMAL; // 混屏视频的模式,这里填的默认值
mPublisherConfiguration.setVideoMixerParams(videoMixerParams);
// 将配置对象传递给 SDK
mTTTEngine.configPublisher(mPublisherConfiguration);
# 5. 设置本地视图和视图相关参数
如果你想实现一个语音直播,可忽略此步骤。
- 调用
enableVideo
方法启用视频模块。 - 调用
setVideoProfile
设置视频参数。 - 调用
createRendererView
方法创建一个 SurfaceView 对象。 - 调用
setupLocalVideo
方法设置本地视图。
private void setupLocalVideo() {
// 启用视频模块。
mTTTEngine.enableVideo();
// 设置视频参数
mTTTEngine.setVideoProfile(Constants.TTTRTC_VIDEOPROFILE_360P);
// 创建 SurfaceView 视频渲染控件。
SurfaceView surfaceView = TTTRtcEngine.CreateRendererView(mContext);
surfaceView.setZOrderMediaOverlay(true);
// 配置本地视频渲染控件,必须先进行配置,再添加到布局上。
VideoCanvas localVideoCanvas = new VideoCanvas(0,Constants.RENDER_MODE_HIDDEN, mLocalView);
mTTTEngine.setupLocalVideo(localVideoCanvas, getRequestedOrientation());
// 添加渲染控件到布局上
mParentLayout.addView(surfaceView);
}
# 6. 加入频道
完成设置角色和本地视图后(视频直播场景),你就可以调用 joinChannel
方法加入频道。你需要在该方法中传入如下参数:
token:传入能标识用户角色和权限的 Token。可设为如下一个值:
NULL
不启用 Token 功能。- 在你的服务器端生成的 Token。在安全要求高的场景下,我们推荐你使用此种方式生成的 Token 。
channelName:传入能标识频道的频道 ID。App ID 相同、频道 ID 相同的用户会进入同一个频道。当前 SDK 仅支持数字类型的字符串,数值范围为1-9,不支持任何特殊符号,英文字母,空格等,长度续保证为 Long 类型的最大值以内。
optionalUid: 本地用户的 ID。数据类型为长整型,且频道内每个用户的 uid 必须是唯一的。
...
// 监听加入频道成功的回调
@Override
public void onJoinChannelSuccess(String channel, long uid, int elapsed) {}
// 监听加入频道失败的回调
@Override
public void onError(int errorType) {}
// 监听已在频道内,收到异常退出的信令的回调。原因具体看 reason 参数
@Override
public void onUserKicked(long uid, int reason) {
// 退出当前频道
mTTTEngine.leaveChannel();
}
...
private void joinChannel() {
// 不使用 Token 加入频道。
private String mRoomName = "123";
private long mUid = 1234;
mTTTEngine.joinChannel("", mRoomName, mUid);
}
...
# 7. 离开频道
结束直播或离开当前直播频道。
mTTTEngine.leaveChannel();