直播系统源码可以说是近年来最火的互联网项目,各大直播系统源码如雨后春笋般先后兴起,转眼间主播这一行业也成为最赚钱的代名词。那我们就来从0开始搭建一个直播系统源码吧。

WebRTC
WebRTC,名称源自网页实时通信(Web Real-Time Communication)。是一个支持网页浏览器进行实时语音对话或视频对话的技术,谷歌于2010年收购获得。2011年5月开放了工程的源代码,成为下一代视频通话的标准。

优点
WebRTC作为一个面向网页浏览器的实时语音视频技术,主要有以下几个优点:

具有良好的通用性,几乎在任何平台都可以正常使用。
其使用的Interactive Connectivity Establishment(ICE)能让各个设备之间自动匹配当前最好的通讯方式,这是很多别的技术都不具备的。
具备全双工的能力,即双向通讯(P2P),不仅可作为单向直播使用还能完成电子视频会议的双向音视频对话。
为Google旗下,具有良好的发展前景,最重要的:开源。

开始使用
导包
这里没有直接使用官方的原生库进行编译,因为太麻烦了,网上已经有组织提供了编译好的版本可以供我们直接使用,对库的提供者不是很了解,不知道是属于什么性质的,但是几乎市面上所有的Android端都是采用该库所以应该没有什么问题。

implementation 'io.pristine:libjingle:11139@aar'

快速开始
以下步骤都是经过分类和优化后整理出来的,加上注释,大多都能读懂,因此就不详细解释了。如有不清楚的地方可以留言问我。

初始化,Peer连接工厂类:

//初始化 关键
PeerConnectionFactory.initializeAndroidGlobals(context, true, true, true)
factory = PeerConnectionFactory()

获得Media,简单理解就是需要传输的音视频流:

//获取视频源
val videoCapture = VideoCapturerAndroid.create(CameraEnumerationAndroid.getNameOfBackFacingDevice())
val videoSource = factory.createVideoSource(videoCapture, MediaConstraints())
//获取音频源
val audioSource = factory.createAudioSource(MediaConstraints())
//获取封装MediaTrack
val videoTrack = factory.createVideoTrack("ARDAMSv0", videoSource)
val audioTrack = factory.createAudioTrack("ARDAMSa0", audioSource)
//封装媒体流
localMs = factory.createLocalMediaStream("ARDAMS")
localMs?.addTrack(videoTrack)
localMs?.addTrack(audioTrack)
//预览
preview?.invoke(localMs!!)

配置ICE,进行网络连接:

//Ice NAT穿透
val iceList = ArrayList<PeerConnection.IceServer>()
iceList.add(PeerConnection.IceServer("stun:23.21.150.121"))
iceList.add(PeerConnection.IceServer("stun:stun.l.google.com:19302"))
//媒体限制
val constraints = MediaConstraints()
constraints.mandatory.add(MediaConstraints.KeyValuePair("OfferToReceiveAudio", "true"))
constraints.mandatory.add(MediaConstraints.KeyValuePair("OfferToReceiveVideo", "true"))
constraints.optional.add(MediaConstraints.KeyValuePair("DtlsSrtpKeyAgreement", "true"))
pc = factory.createPeerConnection(iceList, constraints, Observer())
pc?.addStream(localMs)

这里使用的是stun方式,ICE逻辑判断逻辑很复杂,主要分为两种方式:STUN、TURN。

STUN是将本地地址转换成外部可访问的公网地址,说白了有点像内网穿透的意思。

TURN则是需要自己搭建,由公共的中介服务器分配地址。

创建Offer:

pc?.createOffer(Observer(), MediaConstraints())

WebRTC模型中Peer之间需要进行信令交换,而承载信令的载体就是Offer/Answer,这里因为是实现的直播系统源码推流端,因此创建的是Offer,如果是观看端则需要创建Answer。

信令交换:

private inner class Observer : SdpObserver, PeerConnection.Observer {//创建offer成功override fun onCreateSuccess(p0: SessionDescription?) {log("offer:${p0?.description}")pc?.setLocalDescription(Observer(), p0)val jsonObject = JSONObject()jsonObject.put("id", "presenter")jsonObject.put("sdpOffer", p0?.description)SocketUtils.sendMsg(jsonObject.toString())log("json:$jsonObject")}//创建offer失败override fun onCreateFailure(p0: String?) {log("error: create offer $p0")}//当网络可用即Ice穿透成功override fun onIceCandidate(p0: IceCandidate?) {val jsonObject = JSONObject()jsonObject.put("id", "onIceCandidate")val ice = JSONObject()ice.put("sdpMid", p0?.sdpMid)ice.put("sdpMLineIndex", p0?.sdpMLineIndex)ice.put("usernameFragment", p0?.sdp?.substringAfter("ufrag ")?.substring(0, 4))ice.put("candidate", p0?.sdp)jsonObject.put("candidate", ice)SocketUtils.sendMsg(jsonObject.toString())log("iceCandidate:$p0")log("json:$jsonObject")}
}

通过Socket获得:

  private fun setRemoteSdp(sdp: String) {val answer = SessionDescription(SessionDescription.Type.ANSWER, sdp)pc?.setRemoteDescription(Observer(), answer)}private fun setRemoteIce(ice: EventIceCandidate) {ice.candidate?.let {pc?.addIceCandidate(IceCandidate(it.sdpMid,it.sdpMLineIndex,it.candidate))}}

显示画面

 gl_view.preserveEGLContextOnPause = truegl_view.keepScreenOn = trueVideoRendererGui.setView(gl_view) {RtcClient(this).preview = { localMs ->// local and remote renderval localRender = VideoRendererGui.createGui(LOCAL_X_CONNECTED, LOCAL_Y_CONNECTED,LOCAL_WIDTH_CONNECTED, LOCAL_HEIGHT_CONNECTED,RendererCommon.ScalingType.SCALE_ASPECT_FILL,false)localMs.videoTracks[0].addRenderer(localRender)}}

主要流程
直播端
初始化,Peer连接工厂类。
获取Media,创建GL渲染器,进入显示就绪状态。
配置ICE并监听,当Candidate收集完成发送给远程端。
创建Offer,当Offer创建完成发送给远程端。
接收远程端发送的ICE信息,并设置给PeerConnection对象。
接收远程端返回的Answer,并设置给PeerConnection对象。
建立连接,开始直播。

观看端
初始化,Peer连接工厂类。
获取Media,创建GL渲染器,进入显示就绪状态。
配置ICE并监听,当Candidate收集完成发送给远程端。
接收远程端发送的ICE信息,并设置给PeerConnection对象。
接收远程端发送的Offer,并设置给PeerConnection对象。
创建Answer,当Answer创建完成发送给远程端。
建立连接,开始直播。

以上就是基于WebRTC搭建直播系统源码的全部内容了。

基于WebRTC搭建直播系统源码相关推荐

  1. 使用webrtc开发直播系统源码,开发音视频语聊房

    Webrtc作为一种实时通信技术,广泛应用于网络视频会议.在线教育和在线直播等领域.本文将介绍如何使用Webrtc技术搭建一个实时通信的直播系统,以及相关的源码实现. 1. Webrtc技术简介 1. ...

  2. 如何只需三步搭建一对一直播系统源码

    随着当下直播行业的红火几乎所有的人手机上都安装了直播app,但是呢直播app也包含很多分类,有一对多直播的还有一对一直播系统,这些系统都是通过直播源码搭建起来的,直播系统开发便获得越来越多程序员的关注 ...

  3. 一对一直播系统源码——如何只需三步搭建

    随着广播行业的蓬勃发展的生活几乎所有人安装应用程序,但是主应用程序还包含很多分类,一对多的直播,一个一个系统,这些系统通过生活建立源代码,广播系统开发从程序员获得越来越多的关注,事实上,只要有一个活系 ...

  4. 搭建PHP直播系统源码的教程,手把手教你手机直播app制作

    如果你有一份PHP直播系统源码,那你一定需要这份搭建教程,作为手机直播app制作的最后一步,"搭建"成为了不少人的心头痛,现在就让我们一起来看看,PHP直播系统源码该如何搭建吧! ...

  5. 直播系统源码如何对直播平台进行搭建?

    最近,直播因为连麦技术又掀起了一股热浪,人们对于搭建直播平台更是乐此不疲,那么如何用直播系统源码进行直播平台的搭建呢? 首先要解决的是对视频编码压缩技术的实现,然后是对编码内容的转码,接下来,我们来详 ...

  6. 带货直播系统源码中,商品详情页是如何搭建起来的

    市面上大多数带货直播系统源码的商品介绍详情页,都是仿照淘宝的商品详情页的制作的,那么这个模块是如何通过代码建立起来的呢?下面小编将会通过代码来描述其实现过程. 1.实现滑动控制到导航栏的显示和隐藏 m ...

  7. 直播系统源码App中Android酷炫礼物动画直播平台源码搭建教程(上篇)

    直播系统源码App中Android酷炫礼物动画直播平台源码搭建教程(上篇) 在当下移动直播火爆的年代,如果你曾经使用过移动端直播应用,相信会被里面那令人惊叹的礼物动画效果迷住,比如像下面这样的效果. ...

  8. 教育直播系统源码搭建的关键点、代码解析

    目前,直播已经应用到了各种传统行业,其中直播带货和教育直播在近两年"风生水起",特别是在线教育,很多传统的教培机构已经开始转型线上.那么,教育直播系统源码开发时有哪些关键点呢?下文 ...

  9. 一对一直播平台搭建,选择直播系统源码,这几点不容忽视

    想要运营一个一对一直播平台,搭建网站是前提,而选择源码则是一切的基础,他关系到直播平台能否平稳运行.当然,源码的价格也都不便宜,便有很多想要自己开发平台的人,从各种渠道查找免费的直播源码使用,但使用这 ...

  10. 如何进行直播搭建,带货直播系统源码怎么制作?

    现在网上购物已经成了人们生活中不可缺少的一部分,带货直播系统源码也受到广泛关注,今天我们来看下当我们从商城里面浏览搜索了商品,看到了自己喜欢的商品准备加入到购物车的这个功能实现. 带货直播系统源码功能 ...

最新文章

  1. 【图论专题】拓扑排序
  2. linux删除垃圾文件夹,优雅地删除 Linux 中的垃圾文件第六季
  3. python compile正则_Python 正则表达式:compile,match
  4. 细数那些能让人惊喜的windows技巧
  5. python调用第三方软件发信代码_【IT专家】python调用第三方邮件接口
  6. vc得到屏幕的当前分辨率方法
  7. DropDownList 控件不能触发SelectedIndexChanged 事件的另一个原因
  8. 将iphone中的照片同步到电脑
  9. 计算机教育部学科评估2019,2019教育部8大学科评估公示名单,学科实力一眼较高低!...
  10. Dollar toolbox 学习笔记(一)
  11. 图像优化算法(HE、AHE、CLAHE)简单介绍
  12. 【spine】原理介绍和程序实现
  13. 递归法:从n个小球中取m个小球(不放回),共有多少种取法?
  14. 总结-eclipse
  15. CMMI3-CMMI5认证费用及认证周期
  16. Zigbee和wifi信道设置避免同频干扰
  17. 报错 | Cannot find module ‘@better-scroll/core/dist/types/BScroll‘
  18. 蓝色的网站商城后台通用管理模板——后台
  19. 计算一个数的 N 次方的多种解法
  20. 7、万国觉醒建筑白天黑夜效果(Shader Graph)

热门文章

  1. JMeter自动化测试工具超详细基础讲解(一)
  2. 中国及中国各省矢量地图数据下载
  3. Unity实现打飞碟小游戏
  4. linux pt远程下载,Linux中使用Transmission下载BT/PT[zz]
  5. android创建vcf格式,C#生成vcf 文件源代码 QuotedPrintable 解码支持中文支持Android-vcf文件怎么打开...
  6. DDD-领域驱动设计
  7. 软考系统集成项目管理工程师备考经验资料分享
  8. PowerDesigner 报错 Could not Initialize JavaVM!
  9. 音频处理之回声消除及调试经验
  10. 【数据库系统概念】数据库基本概念