本文介绍如何在 Android 端使用 溪流湖直播推流 SDK 快速实现直播推流。详细接口文档及说明请点开查看 Android端推流SDK
本节介绍如何创建项目,将 溪流湖直播推流SDK 集成进您的项目中,并添加必要的设备权限。
参考以下步骤创建一个 Android 项目。若已有 Android 项目,可以直接查看 2.集成 SDK。
将 SDK 包内 libs 路径下的如下文件,拷贝到您的项目路径下:
文件或文件夹 | 项目路径 |
---|---|
krtc-6.xx.aar 文件 | /app/libs/ |
在 /app/build.gradle 文件中添加 aar 依赖和必要的第三方库,如下:
android {
...
defaultConfig{
...
ndk {
abiFilters 'armeabi-v7a'
}
}
}
repositories {
flatDir {
dirs 'libs'
}
}
dependencies{
implementation(name:'krtc-5.xx.aar', ext:'aar')
}
根据场景需要,在 /app/src/main/AndroidManifest.xml 文件中添加如下行,获取相应的设备权限:
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
<uses-permission android:name="android.permission.BLUETOOTH" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
...
</manifest>
本节介绍如何实现直播推流。直播推流的 API 调用时序见下图:
根据场景需要,为您的项目创建视频通话的用户界面。若已有界面,可以直接查看 2.导入类。
我们推荐您添加如下 UI 元素来实现一个视频通话:
在项目通话的 Activity 文件中添加如下行:
import com.kwai.video.krtc.rtcengine.IKRtcEngineEventHandler;
import com.kwai.video.krtc.rtcengine.KRtcEngine;
import com.kwai.video.krtc.rtcengine.KRtcEngineConfig;
import com.kwai.video.krtc.rtcengine.camera.KVideoCanvas;
在启动 Activity 时检查并获取 Android 移动设备的摄像头和麦克风使用权限。
private static final int PERMISSION_REQ_ID = 33;
// App 运行时确认麦克风和摄像头设备的使用权限。
private static final String[] REQUESTED_PERMISSIONS = {
Manifest.permission.RECORD_AUDIO,
Manifest.permission.CAMERA
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_video_call);
// 获取权限后,初始化 KRtcEngine,并开始直播。
if (checkSelfPermission(REQUESTED_PERMISSIONS[0], PERMISSION_REQ_ID) &&
checkSelfPermission(REQUESTED_PERMISSIONS[1], PERMISSION_REQ_ID)) {
initKRtcEngineAndStartLivePush();
}
}
private void initKRtcEngineAndStartLivePush() {
initKRtcEngine();
initLocalVideo();
setupMediaParameters();
startLivePush();
}
private boolean checkSelfPermission(String permission, int requestCode) {
if (ContextCompat.checkSelfPermission(this, permission) !=
PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(this, REQUESTED_PERMISSIONS, requestCode);
return false;
}
return true;
}
在调用其他 KRtcEngine API 前,需要创建并初始化 KRtcEngine 对象。
您还可以根据场景需要,在初始化时注册想要监听的回调事件,如直播推流状态回调。 注意:不要在这些回调中进行 UI 操作,需要在主线程中进行 UI 操作。
private void initKRtcEngine() {
KRtcEngineConfig config = new KRtcEngineConfig();
config.mAppId = "appID"; // 必填,申请的 appID
config.mContext = getApplicationContext(); // 必填
config.mHandler = new IKRtcEngineEventHandler() { // 设置事件监听
@Override
public void onPushStreamStateChanged(String channelId, @PushStreamState int state, @PushStreamError int error) {
super.onPushStreamStateChanged(channelId, state, error);
switch(state) {
case PushStreamState.KPushStreamStateRunning:
// do sth.
break;
case PushStreamState.KPushStreamStateFailed:
// do sth.
break;
default:
break;
}
}
};
// 设置日志路径
config.mLogConfig = new KRtcEngineConfig.KLogConfig();
config.mLogConfig.fillePath = "/sdcard/krtc_sdk_logs/krtc.log";
try {
rtcEngine = KRtcEngine.create(config);
} catch (Exception e) {
e.printStackTrace();
}
...
}
成功初始化 KRtcEngine 对象后,需要在开始直播前设置本地视图,以便开启摄像头在直播中看到本端视频。参考以下步骤设置本端视图:
调用 enableVideo 方法启用视频模块。 根据需要调用 createLocalSurfaceView 方法创建一个 SurfaceView 对象,或者调用 createLocalTextureView 方法创建一个 TextureView 对象。 然后用创建的 view 和其他相关参数初始化一个 KvideoCanvas 对象来调用 bindLocalVideoView 方法绑定本地视频预览画布,最后调用 startPreview 开启摄像头预览。
private void initLocalVideo() {
rtcEngine.enableVideo();
// 创建 SurfaceView 对象
private FrameLayout mLocalContainer;
SurfaceView mLocalView = RtcEngine.createLocalSurfaceView(mContext);
// 添加视图 UI
RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams(500, 500);
layoutParams.topMargin = 10;
layoutParams.bottomMargin = 10;
mLocalView.setZOrderMediaOverlay(true);
mLocalContainer.addView(mLocalView, layoutParams);
// 设置本地视图
mRtcEngine.bindLocalVideoView(new KVideoCanvas(mLocalView, RenderMode.KScaleToFit, mUserId, VideoSourceType.KVideoSourceTypePeople));
// 启动预览
rtcEngine.startPreview();
}
调用 setVideoEncoderConfiguration 设置视频编码的分辨率,码率,帧率等参数;调用 setLiveAudioProfile 设置音频相应 profile。
private void setupMediaParameters() {
// 设置视频编码参数
KRtcEngine.VideoEncoderConfiguration config = new KRtcEngine.VideoEncoderConfiguration(720, 1280, 15, 2000);
rtcEngine.setVideoEncoderConfiguration:("YourChannelId", config);
// 设置音频编码参数
rtcEngine.setLiveAudioProfile("YourChannelId", LiveAudioProfile.KLiveAudioProfileMusicHigherQualityStereo);
}
完成初始化和设置本地视图后,您就可以调用 startPush 方法开始直播。您需要在该方法中传入如下参数:
private void startLivePush() {
...
rtcEngine.startPush("TOKEN", "CHANNELID", "STREAM_URL");
...
}
根据场景需要,如停止直播、关闭 App 或 App 切换至后台时,调用 stopPush 停止直播。
@Override
protected void onDestroy() {
super.onDestroy();
if (rtcEngine != null) {
// 停止直播
rtcEngine.stopPush("CHANNELID");
// 在不需要使用 SDK 时销毁实例
KRtcEngine.destroy();
}
}
在 Android 设备中运行该项目。当直播推流成功后,您可以看到本地视频,同时可以用 ffplay 等工具拉取到直播流(拉流地址由业务层根据指定规则生成)。