工具要求:
(1) Android Studio 3.2或更高版本。
(2) SDK targetVersion至少为26。
本文直播平台源码聊天室是集成环信IM SDK实现聊天功能,及实现发送礼物、点赞和弹幕等功能。视频直播采用的是七牛相关的推拉流SDK。app server实现了创建聊天室,记录聊天室信息等功能,采用的是环信配套直播聊天室的开源项目。
因而文章分为三块进行介绍:
1、集成聊天室SDK,实现发送消息功能,实现发送礼物、点赞及弹幕等自定义消息。
2、集成视频直播SDK。
3、与app server的交互。
集成聊天室SDK,实现消息、发送礼物、点赞及弹幕等功能
1、注册环信账号
如果还没有环信账号的话,就赶紧注册一个吧
在这里需要注意的是注册模式,分为两种:开发注册或授权注册。如果是自己测试用的话,默认开发注册就好,这样在移动端也可以注册环信id。如果是项目中,建议使用授权注册,防止环信id被误注册,有可能会导致将来服务器注册环信id时会失败。
添加完应用后,就可以获得环信的Appkey了。
2、添加build.gradle依赖
implementation 'com.hyphenate:hyphenate-sdk-lite:3.6.7'
最新版本的sdk请从这里查看:环信Android SDK更新日志。
3、SDK初始化
建议在自己的application中进行初始化
EMClient.getInstance().init(context, options);
context就是application,options是对环信提供的对聊天的配置类,举例如下:
EMOptions options = new EMOptions();
//设置rest server地址,如果需要设置的话,一般用环信默认的就好
options.setRestServer("xxx.com");
//设置im server地址,如果需要设置的话,一般用环信默认的就好
options.setIMServer("xxx.xxx.xxx.xxx");
//设置im server 端口号
options.setImPort(xxx);
当然一般而言是不需要进行配置的,用环信默认的就好,如果需要配置的话,就在EMOptions这个类里进行配置就好。
当然EMOptions还有其他的配置,需要进行配置的话,就看这个类提供的方法吧,说明写的也很详细。
如果需要配置的话,配置好以后,就把设置好的options添加到EMClient.getInstance().init(context, options)中就好。
至此,添加依赖和初始化已经完成了。
同时为了方便大家查看环信SDK的日志,建议大家在调试的时候添加如下设置:
EMClient.getInstance().setDebugMode(BuildConfig.DEBUG);
这段代码就加在SDK初始化后面就好。
4、添加环信Appkey到AndroidManifest.xml中
<application
......>
<!-- 设置环信应用的AppKey,就在这里填写刚等到的AppKey -->
<meta-data android:name="EASEMOB_APPKEY" android:value="Your AppKey" />
<!-- 声明SDK所需的service SDK核心功能-->
<service android:name="com.hyphenate.chat.EMChatService" android:exported="true"/>
<service android:name="com.hyphenate.chat.EMJobService"
android:permission="android.permission.BIND_JOB_SERVICE"
android:exported="true"
/>
<!-- 声明SDK所需的receiver -->
<receiver android:name="com.hyphenate.chat.EMMonitorReceiver">
<intent-filter>
<action android:name="android.intent.action.PACKAGE_REMOVED"/>
<data android:scheme="package"/>
</intent-filter>
<!-- 可选filter -->
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED"/>
<action android:name="android.intent.action.USER_PRESENT" />
</intent-filter>
</receiver>
</application>
详细的集成配置,参考环信官方文档:Android SDK 导入
5、注册及登录环信id
(1)注册环信id
在实际开发的项目中,一般而言注册环信账号都是app server完成的,如果在第一步注册环信账号的时候,选择的开发注册,就可以在移动端调用如下接口注册环信id了:
EMClient.getInstance().createAccount(username, password);
1
这里的username就是注册成功后的环信id,username只能是字母和数字。
(2)登录环信id
登录环信id,调用如下接口:
EMClient.getInstance().login(username, password, new EMCallBack() {
@Override
public void onSuccess() {
//注册成功的回调
}@Override
public void onError(int code, String error) {
//注册失败的回调
}@Override
public void onProgress(int progress, String status) {}
});
这里需要注意的是,环信id的字母均是小写的,登录的时候注意一下大小写的转换,否则可能就会造成,注册成功后,怎么老是登录不上去的尴尬事情了。
6、加入聊天室并注册消息监听
项目中创建聊天室是由app server负责完成的,移动端只需根据app server返回的聊天室id加入该聊天室,调用接口如下:
EMClient.getInstance()
.chatroomManager()
.joinChatRoom(chatroomId, new EMValueCallBack<EMChatRoom>() {
@Override
public void onSuccess(EMChatRoom emChatRoom) {
//加入聊天室成功,处理其他逻辑
}@Override
public void onError(int i, String s) {
//加入聊天室失败,添加失败的逻辑
}
});
注册及移除消息监听
@Override
public void onResume() {
super.onResume();
// register the event listener when enter the foreground
EMClient.getInstance().chatManager().addMessageListener(messageListener);
}
@Override
public void onStop() {
super.onStop();
// unregister this event listener when this activity enters the
// background
EMClient.getInstance().chatManager().removeMessageListener(messageListener);
}@Override
public void onMessageReceived(List<EMMessage> messages) {
for (EMMessage message : messages) {
String username = null;
// 群组消息
if (message.getChatType() == EMMessage.ChatType.GroupChat
|| message.getChatType() == EMMessage.ChatType.ChatRoom) {
username = message.getTo();
} else {
// 单聊消息
username = message.getFrom();
}
// 如果是当前会话的消息,刷新聊天页面
if (username.equals(chatroomId)) {
//处理新消息
...
}
}
}
根据消息监听,实现消息刷新,礼物,点赞及弹幕等功能。礼物,点赞及弹幕等功能后面再介绍。
注册聊天室监听
//加入聊天室成功后,注册聊天室监听
EMClient.getInstance().chatroomManager().addChatRoomChangeListener(roomChangeListener);
移除聊天室监听
@Override
public void onDestroyView() {
super.onDestroyView();
EMClient.getInstance().chatroomManager().removeChatRoomListener(roomChangeListener);
}
聊天室监听
@Override
public void onChatRoomDestroyed(String roomId, String roomName) {
if (roomId.equals(chatroomId)) {
//聊天室被销毁,则退出页面
mContext.finish();
}
}@Override
public void onMemberJoined(String roomId, String participant) {
//有成员加入
}@Override
public void onMemberExited(String roomId, String roomName, String participant) {
//有成员退出
}@Override
public void onRemovedFromChatRoom(int reason, String roomId, String roomName, String participant) {
//被移除聊天室
}@Override
public void onMuteListAdded(String chatRoomId, List<String> mutes, long expireTime) {
//被禁言
}@Override
public void onMuteListRemoved(String chatRoomId, List<String> mutes) {
//移出禁言列表
}@Override
public void onWhiteListAdded(String chatRoomId, List<String> whitelist) {
//被加入白名单
}@Override
public void onWhiteListRemoved(String chatRoomId, List<String> whitelist) {
//从白名单中移出
}@Override
public void onAllMemberMuteStateChanged(String chatRoomId, boolean isMuted) {
//一键禁言状态变化
}@Override
public void onAdminAdded(String chatRoomId, String admin) {
//添加管理员
}@Override
public void onAdminRemoved(String chatRoomId, String admin) {
//移出管理员
}@Override
public void onOwnerChanged(String chatRoomId, String newOwner, String oldOwner) {
//主播(房主)发生变化
}@Override
public void onAnnouncementChanged(String chatRoomId, String announcement) {
//公告发生改变
}
7、礼物,点赞及弹幕等功能实现
礼物、点赞及弹幕的实现,依靠的是环信提供的自定义消息(CUSTOM)类型实现的。
发送自定义消息如下:
/**
* 发送自定义消息
* @param to
* @param chatType
* @param event 礼物,点赞或者弹幕等定义可由event参数区分
* @param params 需要传递的参数,礼物等相关参数就可放于这个参数中
* @param callBack
*/
public void sendCustomMsg(String to, EMMessage.ChatType chatType, String event, Map<String, String> params, final OnMsgCallBack callBack) {
final EMMessage sendMessage = EMMessage.createSendMessage(EMMessage.Type.CUSTOM);
EMCustomMessageBody body = new EMCustomMessageBody(event);
body.setParams(params);
sendMessage.addBody(body);
sendMessage.setTo(to);
sendMessage.setChatType(chatType);
EMClient.getInstance().chatManager().sendMessage(sendMessage);
}
具体用法可参考环信自定义消息类型用法:发送自定义类型消息。
实际开发中,可以对自定义消息进行进一步的封装,比如最终封装为发送礼物,发送点赞和发送弹幕的方法,可参考如下:
/**
* 发送礼物消息
* @param giftId 礼物id
* @param num 礼物数量
* @param callBack
*/
public void sendGiftMsg(String giftId, int num, OnMsgCallBack callBack) {
Map<String, String> params = new HashMap<>();
params.put(MsgConstant.CUSTOM_GIFT_KEY_ID, giftId);
params.put(MsgConstant.CUSTOM_GIFT_KEY_NUM, String.valueOf(num));
sendGiftMsg(params, callBack);
}
8、直播平台源码聊天室页面的搭建及礼物等动画的实现
具体的根据项目产品经理的要求进行开发,最后附的环信直播聊天室中有搭建的页面以及一些基本动画的实现,可以借鉴一下。
至此,环信IM SDK集成及实现就完成了。下面看看如何集成七牛的SDK。
集成视频直播SDK,实现视频直播及播放
demo中是将视频直播的相关逻辑,抽取到library中,为了方便进行视频SDK的更换。
基于环信demo中提供的视频直播方案,就以集成七牛SDK进行说明。
1、注册七牛账号。
注册地址:七牛
注册完七牛账号以后,需要配置自己的域名,如果还没有域名的话,需要到有关部门去备案才可以。
2、添加推拉流依赖
因为七牛没有提供远程依赖,直接去下载jar包置于libs文件夹下,so文件置于jniLibs文件夹下即可。
推流jar包及so文件下载地址:推流端。
播放端jar包及so文件下载地址:播放端。
3、添加相关权限
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<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.WAKE_LOCK" />
<uses-feature android:name="android.hardware.camera.autofocus" />
<uses-feature android:glEsVersion="0x00020000" android:required="true" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
以上权限包含推拉流两端。
4、推流端初始化
StreamingEnv.init(getApplicationContext());
建议在application中进行初始化。
5、搭建推拉流页面
具体页面搭建,参考环信demo。
6、设置推拉流地址
(1)设置推流地址
推流地址从app server请求得到,因为app server需要进行鉴权等操作,得到推流地址后设置如下:
StreamingProfile mProfile = new StreamingProfile();
mProfile..setPublishUrl(publishUrl);
具体设置可以参考环信直播聊天室中PushStreamHelper中的设置,或者参考七牛官网给的参数设置。
(2)播放地址设置
推流地址也是从app server请求得到的,设置如下:
//在调用播放器的控制接口之前,必须先设置好播放地址.传入播放地址,可以是 /path/to/local.mp4 本地文件绝对路径,或 HLS URL,或 RTMP URL
videoview.setVideoPath(url);
......
videoview.start();
videoview为七牛SDK提供的PLVideoTextureView类。
具体设置可以参考环信直播聊天室,或者参考七牛播放端SDK功能使用。
7、注意事项
(1)需注册七牛账号,并通过七牛官网申请并开通直播权限。
(2)推流SDK v3.0.0 及以后版本需要获取授权才可使用,即SDK会校验包名,需联系七牛客服获取授权。
(3)demo中推拉流地址需替换为自己的域名。
至此视频直播的推拉流SDK都集成完了,就可以进行简单的推拉流了,如果要设置美颜或者添加更加详细的设置,请查看七牛推流端设置和七牛播放端设置。
下面介绍移动端与app server间的交互。
与app server的交互
环信提供配套的app server demo在这里:AppServer.。
具体app server api介绍看这里:直播间API文档。
目前app server提供了如下接口:
1、创建直播平台源码直播间
/**
* 创建直播室
* @param module 包括直播室名称,直播室描述,直播室房主,直播室封面,直播室最大人数
* @return
*/
@POST("liverooms")
LiveData<LiveRoom> createLiveRoom(@Body LiveRoom module);
2、获取直播平台源码直播间详情
/**
* 直播室详情
* @param roomId 直播室id
* @return
*/
@GET("liverooms/{id}")
LiveData<LiveRoom> getLiveRoomDetail(@Path("id") String roomId);
该接口会返回直播间id,owner,mute,maxusers等信息。
3、分页获取直播平台源码直播间列表
/**
* 获取直播室列表
* @param limit 一次取的条数
* @param cursor 在这个游标基础上取数据,首次获取传null
* @return
*/
@GET("liverooms")
LiveData<ResponseModule<List<LiveRoom>>> getLiveRoomList(@Query("limit") int limit, @Query("cursor") String cursor);
4、分页获取正在直播的直播平台源码直播间列表
/**
* 获取正在直播的直播室列表
* @param limit 一次取的条数
* @param cursor 在这个游标基础上取数据,首次获取传null
* @return
*/
@GET("liverooms/ongoing")
LiveData<ResponseModule<List<LiveRoom>>> getLivingRoomList(@Query("limit") int limit, @Query("cursor") String cursor);
5、修改直播平台源码直播状态
/**
* 改变直播状态
* @param roomId
* @param username
* @param status 可以为ongoing或offline两种状体
* @return
*/
@POST("liverooms/{liveroomid}/users/{username}/{status}")
LiveData<LiveRoom> changeLiveStatus(@Path("liveroomid") String roomId,
@Path("username") String username,
@Path("status") String status);
status可以为ongoing或offline两种状体,分别代表开始直播和结束直播。
6、获取推流地址
/**
* 获取推流地址
* @param streamKey
* @return
*/
@GET("streams/url/publish/")
LiveData<LiveRoomUrlBean> getLiveRoomPublishUrl(@Query("streamKey")String streamKey);
参数domain(推流域名),hub(直播空间名)和expire(获取推流url过期时间)是可选参数。
7、获取播放地址
/**
* 获取播放地址
* @param streamKey
* @return
*/
@GET("streams/url/play/")
LiveData<LiveRoomUrlBean> getLiveRoomPlayUrl(@Query("streamKey")String streamKey);
注意:
(1)需要注意的是文档中路径格式如下:Path: http://localhost:8080/appserver/liverooms,如果在本地调试时使用localhost有问题,请更换为本地的ip地址即可。
喜大乐奔,至此,可以实现基本的直播聊天室了。
声明:本文由云豹科技转发,如有侵权请联系作者删除