实现简单的直播互动功能,直播软件源码是如何做的

近两年,很多电商平台开始关注起直播互动电商,希望在直播中,也可以增加互动,例如在直播过程中,抛出限量优惠商品,实时发送抢购的消息给观众。于是我们做了一个简单的直播软件源码Demo。

Demo大致的整体想法如下:以视频直播为主的互动模型基础上,结合语音转写功能进行设计,为主播摆脱Windows端繁琐操作,实现快速发题的功能。主播通过语音输入题目(问答题,答案只有是和否),确认后将题目文本发送给所有房间内的观众,观众收到题目后App主动弹框给观众选择结果。

1.1 功能拆解:

  • 只有主播有发布题目入口。
  • 需要ASR(Automatic Speech Recognition-语音识别)功能,有online实时翻译和本地offline翻译两个方案。
  • ASR结果需要主播确认。
  • ASR结果主播确认后需要通知给所有非主播用户。
  • 非主播用户收到题目信息时需要主动弹窗,给用户选择结果。

1.2 方案确定:

  • 为了确保ASR的准确性选择了online实时翻译,通过比对最终选择搜狗知音开放平台。
  • 题目信息也是文本类型,可以借用群聊实时消息通道,给题目信息前面加上特殊字符,非主播用户收到消息时判断是否是以特殊字符开始,如果是remove特殊字符并弹窗显示题目信息。特殊字符定义时可以考虑到扩展性,以后其它类似功能也可以通过该方案来实现。

2.1 视频直播DEMO

一个简单的直播软件源码Demo按以下几个步骤就可以实现了,可以找几个Android设备run一下看看效果,还是相当easy滴。

Step1 SDK集成

SDK还好支持maven依赖,在build.gradle的dependencies模块中加一行就行:

dependencies {
...
implementation 'io.agora.rtc:full-sdk:2.8.1'
}

Step2 直播引擎创建

声网SDK有个重要的类RtcEngine,负责直播功能管理,提供了上/下线、状态监听、音/视频设置等比较丰富的Api,碰到问题时,首先查这个类就对了。创建引擎时APP_ID参数为声网开发平台创建的应用id。

private RtcEngine mRtcEngine;
try {mRtcEngine = RtcEngine.create(context, LiveDefine.APP_ID,
mRtcEventHandler);mRtcEngine.setChannelProfile(Constants.CHANNEL_PROFILE_COMMUNICATION);mRtcEngine.enableAudio(); // 开启音频功能mRtcEngine.enableVideo(); // 开启视频功能
} catch (Exception e) {e.printStackTrace();
}

Step3 直播View关联

角色有主播和观众区分,关联View时有些许区别。ANCHOR_UID为主播用户id,主播端关联View时为自己的用户id,观众端关联view时为观看的主播的用户id。用户系统需要应用自己管理,声网SDK不提供用户管理。

SurfaceView surface = RtcEngine.CreateRendererView(this);
// 主播端View关联
mRtcEngine.setClientRole(Constants.CLIENT_ROLE_BROADCASTER);
mRtcEngine.enableLocalAudio(true); // 主播端需要打开本地音频
mRtcEngine.setupLocalVideo(new VideoCanvas(surface,
VideoCanvas.RENDER_MODE_HIDDEN, ANCHOR_UID)); // 主播端设置的是本地video
mRtcEngine.startPreview();  //主播需要开启视频预览// 观众端View关联
mRtcEngine.setClientRole(Constants.CLIENT_ROLE_AUDIENCE);
mRtcEngine.enableLocalAudio(false); // 观众端不需要打开本地音频
mRtcEngine.setupRemoteVideo(new VideoCanvas(surface,
VideoCanvas.RENDER_MODE_HIDDEN, ANCHOR_UID)); // 观众端设置的是远端即主播video

Step4 加入房间

加入房间时第一个参数token为当前登录账户对应的token,直播软件源码自己管理,测试时可从传空。第二个参数为频道id,也是由直播软件源码自己管理的。第三个参数为频道名称。最后一个参数为当前登录的账户id

mRtcEngine.joinChannel("", CHANNEL_ID, "CHANNEL_NAME", uid);

Step5 离开房间

// 主播端离开
mRtcEngine.setupLocalVideo(null);
mRtcEngine.stopPreview();
mRtcEngine.leaveChannel();
// 观众端离开
mRtcEngine.setupRemoteVideo(null);
mRtcEngine.leaveChannel();

2.2 消息功能

直播软件源码房间消息功能可以说是相对基础而简单的了,我们选用的是声网实时信息SDK,这是一个独立的工具类SDK,声网将实时消息功能解耦出来,可以给各个场景提供消息支持。群聊实时消息可参考如下步骤:

Step1 依赖配置

dependencies {
...
implementation 'io.agora.rtm:rtm-sdk:1.0.1'
}

Step2 消息引擎创建

// APP_ID同视频互动SDK保持一致即可
private RtmClient mRtmClient;
mRtmClient = RtmClient.createInstance(context, LiveDefine.APP_ID, listener);

Step3 房间消息初始化

创建一个消息频道前需要调一次登录操作,第一个参数为应用账户token,第二个参数为账户标识。

mRtmClient.login("", userId,
new ResultCallback<Void>() {@Overridepublic void onSuccess(Void aVoid) {Log.d(TAG, "rtmClient login success");}@Overridepublic void onFailure(ErrorInfo errorInfo) {Log.d(TAG, "rtmClient login fail : " + errorInfo);}
});

创建消息频道,CHANNEL_ID是一个标识,可以和直播频道不一致,但是建议保持一致:

RtmChannel mRtmChannel;RtmChannelListener rtmListener = new RtmChannelListener(){@Overridepublic void onMessageReceived(RtmMessage var1, RtmChannelMember var2){// 收到消息,自己发送的消息也会有该方法回调,可以通过RtmChannelMember判断发送消息的人是不是自己,如果是不处理本次消息即可。}@Overridepublic void onMemberJoined(RtmChannelMember var1){// 有用户加入,可用来做用户上线消息处理}@Overridepublic void onMemberLeft(RtmChannelMember var1){// 有用户离开,可用来做用户离线消息处理}
};
mRtmChannel = mRtmClient.createChannel(CHANNEL_ID,
rtmListener );;

Step4 发送消息

RtmMessage rtmMessage = mRtmClient.createMessage();
rtmMessage.setText(msg);
mRtmChannel.sendMessage(rtmMessage, callback);

Step5 退出消息频道

可在退出直播房间时,调用该方法。

mRtmChannel.release();

2.3 在线语音翻译

首先也是需要注册账户并创建应用,详见搜狗知音文档中心,实现可参考如下步骤:

Step1 初始化

调用init方法初始化

// 以下信息从知音平台申请获得
private static final String BASE_URL = "api.zhiyin.sogou.com";
private static final String APP_ID = "";
private static final String APP_KEY = "";
private SogoSpeech mSogouSpeech;
private DefaultAudioSource mAudioSource;
private OnSogouAsrListener mListener;public void init(Context context) {ZhiyinInitInfo.Builder builder = new ZhiyinInitInfo.Builder();ZhiyinInitInfo initInfo = builder.setBaseUrl(BASE_URL).setUuid(UUID).setAppid(APP_ID).setAppkey(APP_KEY).create();SogoSpeech.initZhiyinInfo(context, initInfo);SogoSpeechSettings settings = SogoSpeechSettings.shareInstance();settings.setProperty(SpeechConstants.Parameter.ASR_ONLINE_AUDIO_CODING_INT,
1);settings.setProperty(SpeechConstants.Parameter.ASR_ONLINE_VAD_ENABLE_BOOLEAN,
false); settings.setProperty(SpeechConstants.Parameter.ASR_ONLINE_VAD_LONGMODE_BOOLEAN,
true); // 长时间ASRsettings.setProperty(Parameter.ASR_ONLINE_LANGUAGE_STRING,
ASRLanguageCode.CHINESE); // 也支持英文ASR ASRLanguageCode.ENGLISmSogouSpeech = new SogoSpeech(context);mSogouSpeech.registerListener(mSpeechEventListener);mAudioSource = new DefaultAudioSource(new AudioRecordDataProviderFactory(context));mAudioSource.addAudioSourceListener(mAudioSourceListener);
}private EventListener mSpeechEventListener = new EventListener() {@Overridepublic void onEvent(String eventName, String param, byte[] data, int offset, int length, Object extra) {if (TextUtils.equals(SpeechConstants.Message.MSG_ASR_ONLINE_LAST_RESULT,
eventName)) {if (null != mListener) {mListener.onSogouAsrResult(param);}stopTransform();}}@Overridepublic void onError(String errorDomain, int errorCode, String errorDescription, Object extra) {// 9002 用户主动取消if (9002 != errorCode && null != mListener) {mListener.onSogouAsrResult("");}stopTransform();}
};private IAudioSourceListener mAudioSourceListener = new IAudioSourceListener() {@Overridepublic void onBegin(IAudioSource iAudioSource) {Log.d(TAG, "AudioSource onBegin");mSogouSpeech.send(SpeechConstants.Command.ASR_ONLINE_START, "", null, 0, 0);}@Overridepublic void onNewData(IAudioSource audioSource, Object dataArray, long packIndex, long sampleIndex, int flag) {final short[] data = (short[]) dataArray;mSogouSpeech.send(SpeechConstants.Command.ASR_ONLINE_RECOGIZE, "", data, (int) packIndex, 0);}@Overridepublic void onEnd(IAudioSource audioSource, int status, Exception e, long sampleCount) {Log.d(TAG, "AudioSource onEnd");mSogouSpeech.send(SpeechConstants.Command.ASR_ONLINE_STOP, "", null, 0, 0);}
};public interface OnSogouAsrListener {void onSogouAsrResult(String result);
}

Step2 开始语音识别

public void startTransform(OnSogouAsrListener listener) {mListener = listener;mSogouSpeech.send(SpeechConstants.Command.ASR_ONLINE_CREATE,
null, null, 0, 0);new Thread(mAudioSource, "audioRecordSource").start();
}

Step3 停止语音识别

正常情况下直播软件源码不需要调用该方法,在EventListener 回调中已经调用过该方法了,为了确保状态正常也可以在退出房间时手动调用一次。

public void stopTransform() {mListener 
= null;if (null != mAudioSource) {mAudioSource.stop();}
}

最后秀一下直播软件源码Demo 实现的效果。
(1)主播端直播发题(语音转文字):

image.png

 

(2)观众端答题

image.png

 

(3)主播端收获答案

image.png

以上,就是直播软件源码实现直播互动的内容了。

声明:本文由云豹科技转发自声网Agora博客,如有侵权请联系作者删除

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/30507.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

直播系统聊天技术(七):直播间海量聊天消息的架构设计难点实践

1、引言 在视频直播场景中&#xff0c;弹幕交互、与主播的聊天、各种业务指令等等&#xff0c;组成了普通用户与主播之间的互动方式。 从技术的角度来看&#xff0c;这些实时互动手段&#xff0c;底层逻辑都是实时聊天消息或指令的分发&#xff0c;技术架构类比于IM应用的话&am…

直播间聊天item图文混排思路

目录 1.版本需求 a.初版本 b.表情包版本 2.思路剖析 a.拼接格式 b.生成格式的操作 c.遍历所有文字&#xff0c;替换图片 d.网络图片的替换逻辑 e.本地图片的替换 f.本地图片快速存储到map g.注意 先上设计图 1.版本需求 a.初版本 一开始&#xff0c;不需要展示聊天…

新媒体运营胡耀文教程:直播间10大话术总结,互动话术不冷场

不知道说什么&#xff0c;不知道怎么说&#xff0c;直播间没人&#xff0c;直播间冷场&#xff0c;这是很多新手主播都会遇到的问题。总结了直播间的10大话术&#xff0c;希望对大家有所帮助。 很多主播&#xff0c;尤其是新人主播&#xff0c;开始和陌生人聊天的时候会感觉到…

《人民日报》申论素材积累

今天我们积累申论素材、必背金句和重点知识。它们来自于一周以来&#xff0c;我们学习的五篇人民日报申论范文&#xff0c;分别是&#xff1a; 1.《传承和弘扬好中华优秀传统文化》&#xff08;周一&#xff09; 2.《无限的未来都以现在为渊源》&#xff08;周二&#xff09;…

利用telnet SMTP给QQ邮箱发邮件

学习计算机网络自顶向下&#xff0c;SMTP协议 步骤一&#xff1a;开启Windows的telnet客户端 打开“控制面板”中“程序”中的“启用或关闭Windows功能” 勾选“Telnet客户端”开启服务 步骤二&#xff1a;打开cmd 这个大家都会 步骤三&#xff1a;命令 SMTP默认端口号是25…

Telnet 发邮件

使用Telnet给163邮箱发送邮件 首先打开系统的Telnet客户端. 将telnet客户端选上 打开cmd命令窗口 连接163的smtp服务器: telnet smtp.163.com 25 (smtp.163.com是163邮箱的服务器,25是端口号!) 如下表示连接成功! 连接成功后需要如下步骤发送邮件: 1.与服务器打招呼: e…

使用PHPMailer发送outlook邮件

PHPMailer: 在微软账号下设置双重验证&#xff1a; 点击安全选项 点击开启 下一步 点击下一步操作&#xff1a; 选择取消 下一步 完成 这时可以看到应用密码、点击即可看到16位的应用密码

国内主流AI大模型盘点

今年年初&#xff0c;轰动科技圈的大事就是ChatGPT的面世&#xff0c;它的到来打响了AI智能时代的第一枪&#xff0c;同时展开了一场别开生面的智能科技革命。 随着ChatGPT迅速走红,国内各大企业纷纷发力认知大模型领域。经过一段时间的酝酿&#xff0c;国内的AI领域也开启了“…

华为申请注册盘古大模型商标;英伟达 A800 一周涨价超 30%;Apache Tomcat 10.1.11 发布 |极客头条...

「极客头条」—— 技术人员的新闻圈&#xff01; CSDN 的读者朋友们早上好哇&#xff0c;「极客头条」来啦&#xff0c;快来看今天都有哪些值得我们技术人关注的重要新闻吧。 整理 | 梦依丹 出品 | CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09; 一分钟速览新闻点&#…

投资理财-不追高

连续44个交易日上万亿&#xff0c;有人说牛市来了&#xff0c;我们需要保持淡定&#xff0c;提个醒&#xff0c;不要去追高&#xff0c;坚持自己的交易规则

投资理财-普通投资的策略

没有太多时间精研个股&#xff0c;未能及时跟踪公司信息&#xff0c;可以考虑指数基金&#xff0c;获取平均收益。 比较合适的有聪明的投资者里面的股债平衡&#xff0c;年轻人可以宽指&#xff0c;在市场另请的时候投入&#xff0c;市场过热的时候出来。

国瀚实业|个人如何投资理财

说到投资理财&#xff0c;很多人并不生疏&#xff0c;那么&#xff0c;2022年个人如何投资理财呢&#xff1f;下面本文就为大家做解答。 1、先保证生活再理财 生活中有很多事情的发生都是难以预料的&#xff0c;比如说下岗失业、突发疾病、投资失败等。而这些事情一旦发生&am…

英伦四地到底是什么关系?

英格兰、苏格兰、威尔士和北爱尔兰四地到底是什么关系&#xff0c;为何苏格兰非要独立&#xff1f;故事还要从中世纪说起。 大不列颠岛位于欧洲西部&#xff0c;和欧洲大陆隔海相望。在古代&#xff0c;大不列颠岛和爱尔兰属于凯尔特人的领地。凯尔特人是欧洲西部一个庞大的族群…

春夏流行英伦风休闲皮鞋 男士尖头皮鞋搭配打造品位潮男

这款英伦风休闲皮鞋&#xff0c;较为圆滑的尖头绑带设计&#xff0c;让人感觉亲切。浅棕色经典百搭&#xff0c;搭配白色衬衫和黑色休闲裤&#xff0c;展现出干净的书生气息。 这款英伦风休闲皮鞋&#xff0c;渐变的深棕色&#xff0c;给人沉稳大气的感觉&#xff0c;尖头设计&…

叶英伦彩墨山水国画

《叶英伦彩墨山水画国画技法》一部由香港岭南画派国际著名书画家叶英伦编著并由岭南美术出版社出版和全国发行的图书。本画书内容讲解理论精炼&#xff0c;达到言简意赅&#xff0c;图例色彩丰富能使学习者更好的掌握美术基础知识。 本画书系统地讲解山水画技法&#xff0c;包括…

npm run dev 后dist 被情况_英国十大90后男明星,高颜值好身材好演技,英伦风更显男人风范...

英国明星不仅颜值高、演技好&#xff0c;还有内涵、充满男性魅力。而这些90后男星精致立体的五官&#xff0c;高大健硕的身材都让人移不开视线。那么英国最帅90后男明星是谁呢&#xff1f;今天TOP10Lists盘点了英国十大最帅90后男星&#xff0c;快来看看你最喜欢的英国90后帅哥…

来自春天的仪式感:英伦花艺佳作,用鲜花点缀生活丨好书优选

关注“潜在价值”&#xff0c;最好的技术商业媒体&#xff0c;了解那些智慧商业 本文由潜在价值旗下 创意产品推荐平台“钛空舱”推出 钛空&#xff08;ID&#xff1a;TiKong-life&#xff09; 一个关注于科技与创意生活的选品、荐品平台 新奇、实用、品质保证 一切关于未来生活…

梦想还是要有的,万一实现了呢?

这是杂货铺的第457篇文章 最近就上次的英超之旅&#xff0c;接受了国安迷弟的专访&#xff0c;很感谢给我这次机会&#xff0c;能和更多的朋友进行交流和分享。从旅程中&#xff0c;能学到些什么&#xff0c;领悟到些什么&#xff0c;让更多人受益&#xff0c;才会更加有意义。…

英超梦幻之行

在去年这个时候&#xff0c;我做了件至少对我来说梦一般的事。一个人&#xff0c;一个箱子&#xff0c;一个背包&#xff0c;踏上了英伦赛场&#xff0c;游历3个城市&#xff0c;打卡9个球场&#xff0c; 其实&#xff0c;要说激励这趟行程的点&#xff0c;可能就是看了BTV-6的…

中科院一博士论文致谢走红,同年的我也有一封未发表的致谢......

大家好&#xff0c;我是早起。 近日&#xff0c;中国科学院自动化所一博士论文的致谢部分在网上引发热议。作者黄国平回顾自己如何一路走出小山坳、和命运抗争的故事&#xff0c;打动了大批网友&#xff0c;并在致谢中说「把书念下去&#xff0c;然后走出去&#xff0c;不枉活一…