手把手带你快速实现直播聊天室

废话不多说,直接开干!
工具要求:
(1) Android Studio 3.2或更高版本。
(2) SDK targetVersion至少为26。
本文聊天室是集成环信IM SDK实现聊天功能,及实现发送礼物、点赞和弹幕等功能。视频直播采用的是七牛相关的推拉流SDK。app server实现了创建聊天室,记录聊天室信息等功能,采用的是环信配套直播聊天室的开源项目。
因而文章分为三块进行介绍:
1、集成聊天室SDK,实现发送消息功能,实现发送礼物、点赞及弹幕等自定义消息。
2、集成视频直播SDK。
3、与app server的交互。
文末最后附有环信提供的直播聊天室的demo地址,本文章就基于此demo进行集成说明。

集成聊天室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);

这里的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地址即可。

喜大乐奔,至此,可以实现基本的直播聊天室了。
最关键的来了,这是有源码的!!
赶紧拿走吧,下面就是源码地址:
环信直播聊天室
环信App Server

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
PyTorch是一个用于深度学习的开源Python库,它提供了丰富的工具和函数,可以简化神经网络模型的实现。Transformers是一种用于自然语言处理的深度学习模型,其基本方法是通过自注意力机制来实现文本序列的编码和解码。下面将手把手教你如何使用PyTorch实现Transformers。 1. 首先,安装PyTorch库。可以通过pip命令来安装:`pip install torch`。 2. 导入必要的库。在代码的开头,导入PyTorch和Transformers相关的库: ``` import torch from transformers import BertModel, BertTokenizer ``` 3. 加载预训练的Transformers模型和分词器。Transformers库提供了一些预训练的模型,可以从Hugging Face的模型库中下载。我们使用Bert模型作为例子: ``` model_name = 'bert-base-uncased' model = BertModel.from_pretrained(model_name) tokenizer = BertTokenizer.from_pretrained(model_name) ``` 4. 输入编码。将文本输入编码成模型所需的格式。使用分词器对文本进行分词,并将分词后的结果转化为模型所需的编码格式: ``` text = "I love PyTorch" tokens = tokenizer.tokenize(text) input_ids = tokenizer.convert_tokens_to_ids(tokens) input_tensor = torch.tensor([input_ids]) ``` 5. 模型前向计算。将输入数据传入模型进行前向计算: ``` model_output = model(input_tensor) ``` 6. 获取特征表示。从模型输出中获取特征表示。对于Bert模型,可以获取词嵌入和每个词的隐藏状态: ``` embeddings = model_output[0] # 词嵌入 hidden_states = model_output[2] # 每个词的隐藏状态 ``` 7. 解码输出。根据任务需求,对模型的输出进行解码。例如,可以使用BertPooler层获取整个句子的语义表示: ``` pooler_output = model.pooler(hidden_states[-1]) # BertPooler层 ``` 以上就是用PyTorch实现Transformers的基本步骤。根据具体任务的不同,可以对模型进行进一步的调整和优化。希望这个手把手教程能够帮到你!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值