背景

最近工作需要做一款直播APP,恩是的,从RTMP协议的实现开始到处理服务器高并发、负载均衡、客户端播放器实现等等等.....
估计全部写完我也到而立之年了吧......
BOSS们估计也是发现了我的困惑,所以打算集成第三方sdk开发,现在大部分的直播产品都会借助第三方的直播技术,这样也可以保证直播的质量。
最后着重测试的还是阿里云和乐视云的第三方sdk,阿里云的直播产品刚出不久,感觉文档以及调试过程还不是很清晰,现在一直没弄明白为啥推流推出去了但是另外一边拉流拉不了,也不知道是播放器的问题还是咋的,用战旗的直播间测试就可以拉到流,希望有大牛可以在评论区告知一二。
本文讲的是乐视云直播Demo的使用过程,感觉乐视在文档逻辑上比阿里云还是强很多的至少,条理清晰逻辑严谨,能让新手很快找到方向。
那么本文的目的呢,是给出一个最简单清晰的Demo整理路线,让各位做到真正的1分钟看懂实现集成乐视sdk的直播Demo实现过程。

乐视云直播测试案例

  • 登陆注册,进入后在顶部产品项里选择移动直播文档在这里
  • 进入移动直播页面后,点击免费开通(免费使用5G流量)
  • 进入移动直播"应用管理"界面,点击创建应用,只需输入名字、类型、平台就可以了,之后我们会看到几个很重要的参数:推流域名、播放域名、发布点名称(live)以及签名密钥,有了这几个东西,我们就可以开始直播测试了。
  1. 应用名称:包晴天直播
  2. 推流域名:17546.mpush.live.lecloud.com
  3. 播放域名:17546.mpull.live.lecloud.com
  4. 发布点名称:live
  5. 签名密钥:V86NL7KWKW1SL530F1KN

  6. 直播推流与播放地址规则:rtmp://{推流域名}/发布点名称/{直播流名称}
  7. 直播流名称可自定义使用,可允许数字或字母的任意字符,但不超过50位。
  • 我们可以进行清晰度选择、录制、安全等设置
  1. 转码后,播放流名称的生成规则:流名称+清晰度标识
  2. 清晰度标识说明,流畅:"_10",标清:"_13",高清:"_16",原画:""。
  3. 例如:播放地址:rtmp://{域名}/发布点/{直播流名称}
  4. 转成高清码率后,高清码率的播放地址为:rtmp://{域名}/发布点/{直播流名称_16}
  • 推流端配置。打开手机的推流端应用,依次输入推流域名,签名密钥,以及流名称。然后点击开始直播,就可以直播推流了。
  • 播放端配置。只需设置播放地址即可,如【rtmp://17546.mpush.live.lecloud.com/live/bqt】
  • 直播过程中,可对所有"直播流"进行控制
以上就是乐视云Demo的全部步骤辣,剩下的开发过程都很简单,从代码中探索即可。

乐视推流端部分代码(设置自己的参数)

/**
 * 无皮肤版和有皮肤版的区别
 * 无皮肤:SDK不去猜测你的业务逻辑。只是提供最基本的接口,比如开始推流、切换滤镜、切换摄像头等。
 * 有皮肤:SDK提供一种业务逻辑的使用办法。比如DEMO中展示的,你点击按钮就可以开始推流,点击下方各个图标就能实现功能切换等
 *
 *
 * 1、所有推流SDK功能和最简单的DEMO,可以直接查看RecorderTestActivity
 * 其中:如果移动直播查看CameraView,云直播查看LeCameraView
 *
 *     2、在AndroidManifest.xml 中,我们默认设置MainActivity的启动方式,MainAcivity提供了漂亮的UI界面。
 *     如果你需要看看 RecorderTestActivity 的运行效果,需要自己在AndroidManifest.xml中进行设置,使用RecorderTestActivity直接启动就行了
 *
 *     3、对于我们提供的UI层,理论不建议修改,但是如果你们确实需要,也可以自己修改,但是出现任何BUG需要自己调试。
 */
public class MainActivity extends Activity {
    // 移动直播【推流域名】,在官网移动直播创建应用后可拿到
    private static final String DEFAULT_DOMAINNAME = "17546.mpush.live.lecloud.com";//216.mpush.live.lecloud.com
    // 移动直播【推流签名密钥】,在官网移动直播创建应用后可拿到
    private static final String DEFAULT_APPKEY = "V86NL7KWKW1SL530F1KN";//KIVK8X67PSPU9518B1WA
    // 移动直播【推流地址】, 当用户知道自己需要推流的地址后可以使用
    private static final String DEFAULT_PUSHSTREAM = "rtmp://17546.mpush.live.lecloud.com/live/bqt";//rtmp://216.mpush.live.lecloud.com/live/demo
    // 乐视云直播推流【用户ID】,用户可以在官网用户中心拿到。另外,我的UUID为yt1jdrioib
    private static final String DEFAULT_LETV_USERID = "835278";//800053
    //乐视云直播推流【用户私钥】,用户可以在官网用户中心拿到
    private static final String DEFAULT_LETV_APPKEY = "14659a5bf736682623ca3f2f69129a16";//60ca65970dc1a15ad421d46f524b99b7
    //乐视【云直播推流ID】,用户开通云直播功能,可以在创建活动后拿到
    private static final String DEFAULT_LETV_STREAMID = "A2016120500000gx";
    //默认流名称使用的是设备的IMEI号

private String default_streamid = "IMEI";


技术实现层面

技术相对都比较成熟,设备也都支持硬编码。
github上有现成的开源实现,推流、美颜、水印、弹幕、点赞动画、滤镜、播放都有。技术其实不是很难,而且现在很多云厂商都提供SDK,七牛云、金山云、乐视云、腾讯云、百度云、斗鱼直播伴侣推流端,功能几乎都是一样的,没啥亮点,不同的是整个直播平台服务差异和接入的简易性。后端现在 RTMP/HTTP-FLV 清一色,App挂个源站直接接入云厂商或CDN就OK。

直播优化层面

其实最难的难点是提高首播时间、服务质量Qos(Quality of Service),如何在丢包率20%的情况下还能保障稳定、流畅的直播体验,需要考虑以下方案:
  • 1.为加快首播时间,收流服务器主动推送 GOP :(Group of Pictures:策略影响编码质量)。所谓GOP,意思是画面组,一个GOP就是一组连续的画面至边缘节点,边缘节点缓存 GOP,播放端则可以快速加载,减少回源延迟
  • 2.GOP丢帧,为解决延时,为什么会有延时,网络抖动、网络拥塞导致的数据发送不出去,丢完之后所有的时间戳都要修改,切记。要不客户端就会卡一个 GOP的时间,是由于 PTS(Presentation Time Stamp,PTS主要用于度量解码后的视频帧什么时候被显示出来) 和 DTS 的原因,或者播放器修正 DTS 和 PTS 也行(推流端丢GOD更复杂,丢 p 帧之前的 i 帧会花屏)
  • 3.纯音频丢帧,要解决音视频不同步的问题,要让视频的delta增量到你丢掉音频的delta之后,再发音频,要不就会音视频不同步
  • 4.源站主备切换和断线重连
  • 5.根据TCP拥塞窗口做智能调度,当拥塞窗口过大说明节点服务质量不佳,需要切换节点和故障排查
  • 6.增加上行、下行带宽探测接口,当带宽不满足时降低视频质量,即降低码率
  • 7.定时获取最优的推流、拉流链路IP,尽可能保证提供最好的服务
  • 8.监控必须要,监控各个节点的Qos状态,来做整个平台的资源配置优化和调度
  • 9.如果产品从推流端、CDN、播放器都是自家的,保障 Qos 优势非常大
  • 10.当直播量非常大时,要加入集群管理和调度,保障 Qos
  • 11.播放端通过增加延时来减少网络抖动,通过快播来减少延时。

运营成本和客户体验

根据网上的数据,斗鱼 TV 为 3 亿人民币,战旗 TV 为 1.5 亿人民币,龙珠为 1.2 亿人民币,虎牙为 3000 万 + 人民币。
运营和推广:这个就比较烧钱了,一些做移动直播、游戏直播、秀场直播的A轮至少得上千万。
用户体验:流畅、不卡顿、不花屏、断线重连、丢包策略、首画加载速度、丰富的礼物系统,为了提高用户体验,可以在后台加载其他页面数据,但要在用户体验和内存优化方面找到平衡点。

流媒体传输

  • TCP:TCP为点对点的协议,虽然能保证了数据传输的可靠性,但是对服务器资源耗费较大,在数据流大的场合难以保证数据流传输的实时性。
  • UDP:UDP为不可靠传输协议,不需要维护连接状态,也不认为每个数据包都必须到达接受端,因此网络负荷比TCP小,传输速度也要比TCP快;但在网络越拥挤时,越有更多的数据包丢失。
  • RTMP:RTMP一个专门为高效传输视频、音频和数据而设计的协议,它通过建立一个二进制TCP连接或者连接HTTP隧道实现实时的视频和声音传输。
  • FFmpeg:FFmpeg是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源计算机程序。采用LGPL或GPL许可证。它提供了录制、转换以及流化音视频的完整解决方案。
 

备用服务器

给没架设服务器的朋友来一套福利:备用服务器地址(亲测可用):

rtmp://live.hkstv.hk.lxdns.com:1935/live/stream123

rtmp://live.hkstv.hk.lxdns.com:1935/live/hks
(将hks名称改成其他的,比如aaa)

rtmp://202.69.69.180:443/live/aaa
(rtmp://202.69.69.180:443/webcast/bshdlive-pc)

rtmp://v1.one-tv.com:1935/live/aaa(rtmp://v1.one-tv.com:1935/live/mpegts.stream)

rtmp://203.207.99.19:1935/live/aaa(rtmp://203.207.99.19:1935/live/CCTV1)

rtmp://202.117.80.19:1935/live/aaa
(rtmp://202.117.80.19:1935/live/live4)

rtmp://ams.studytv.cn/live/aaa
(rtmp://ams.studytv.cn/livepkgr/264)

rtmp://60.174.36.89:1935/live/aaa
(rtmp://60.174.36.89:1935/live/vod3)

直播 背景 技术体系 乐视云直播Demo的更多相关文章

  1. ZEALER背后的乐视云视频

    ZEALER是我非常喜欢的一个测评网站,经常访问看看手机.电动牙刷及机械键盘的测试视频,非常欣赏王自如的数据化测评理念.敬畏之心,以及不祛痘的视频. 刚好最近对网络视频应用比较感兴趣,觉得ZEALER ...

  2. iOS直播集成和问题总结(阿里云直播)

    https://www.jianshu.com/p/714ce954e628 最近接手公司的直播项目,对以前遗留的问题做处理和优化, 于是顺便看了下阿里云直播的文档,在下面写下对直播的理解和遇到的问题 ...

  3. 乐视云监控数据存放到influxdb中

    3.9     监控.告警系统 监控报警我们分PaaS平台和业务应用两大类. PaaS平台主要聚焦在基础设施和LeEngine的各个服务组件的监控报警(比如主机CPU,内存,IO,磁盘空间,LeEng ...

  4. 如何实现1080P延迟低于500ms的实时超清直播传输技术

    再来当一次技术搬运工,内容来自高可用框架,学霸君工程师袁荣喜的如何实现1080P延迟低于500ms的实时超清直播传输技术. 导语:视频直播是很多技术团队及架构师关注的问题,在实时性方面,大部分直播是准 ...

  5. 我所了解的各公司使用的 Ceph 存储集群 (携程、乐视、有云、宝德云、联通等)

    Ceph 作为软件定义存储的代表之一,最近几年其发展势头很猛,也出现了不少公司在测试和生产系统中使用 Ceph 的案例,尽管与此同时许多人对它的抱怨也一直存在.本文试着整理作者了解到的一些使用案例. ...

  6. 乐视云计算基于OpenStack的IaaS实践

    本文作者岳龙广,现在就职于乐视云计算有限公司,负责IaaS部门的工作. 从开始工作就混在开源世界里,在虚拟化方面做过CloudStack/Ovirt开发,现在是做以OpenStack为基础的乐视云平台 ...

  7. TOP100summit【分享实录-网易】构建云直播分发网络

    本篇文章内容来自2016年TOP100summit网易视频云.网易杭州研究院服务端技术专家邵峰的案例分享.编辑:Cynthia 邵峰:网易视频云.网易杭州研究院服务端技术专家浙江大学计算机专业博士毕业 ...

  8. 腾讯云直播+点播全线产品支持AV1,带来极致视频体验

    日前,腾讯视频云直播.点播.媒体处理全线产品均已支持AV1标准,据悉,腾讯云也是国内首家直播+点播同时支持AV1视频处理业务的公有云厂商. 据悉,AV1(Alliance for Open Media ...

  9. vivo直播应用技术实践与探索

    一.概述 2019年vivo直播平台立项,初期与优秀的顶部直播平台进行联运直播开发,进行市场,产品和技术的初步探索:再到后来为了丰富直播的内容和形式,开始自己独立探索:之后,我们结合vivo现阶段的直 ...

随机推荐

  1. 七 使用list和tuple

    list Python内置的一种数据类型是列表:list.list是一种有序的集合,可以随时添加和删除其中的元素. 比如,列出班里所有同学的名字,就可以用一个list表示: >>> ...

  2. poj2299(树状数组+离散化)

    这道题题意很简单,就是求逆序数.用暴力的方法是显然会超时的.这里考虑采用树状数组. 采用树状数组话遇到的问题就是需要999,999,999个空间来存放数据,这显然是不可行的.考虑到输入数据最多只有50 ...

  3. RxSwift 系列(六)

    前言 本篇文章将要学习RxSwift中数学和集合操作符,在RxSwift中包括了: toArray reduce concat toArray 将一个Observable序列转化为一个数组,并转换为一 ...

  4. Highcharts实现走势图

    Highcharts 是一个用纯JavaScript编写的一个图表库, 能够很简单便捷的在web网站或是web应用程序添加有交互性的图表,并且免费提供给个人学习.个人网站和非商业用途使用.HighCh ...

  5. Python并发编程-进程

    由于GIL(全局解释锁)的问题,多线程并不能充分利用多核处理器,如果是一个CPU计算型的任务,应该使用多进程模块 multiprocessing .它的工作方式与线程库完全不同,但是两种库的语法和接口 ...

  6. Java文件签名与验证

    数字签名与验证只需要用户输入三个参数: Ø         原文件 Ø         签名信息文件 Ø         用户名 签名过程: 1.         首先从用户名对应的用户注册文件中读取 ...

  7. python一行代码开启http

    python -m SimpleHTTPServer 8000 & 监听8000端口 浏览器用127.0.0.1:8000访问 如果出现no module named SimpleHTTPSe ...

  8. Tagging Problems & Hidden Markov Models---NLP学习笔记(原创)

    本栏目来源于对Coursera 在线课程 NLP(by Michael Collins)的理解.课程链接为:https://class.coursera.org/nlangp-001 1. Taggi ...

  9. Java 请求webServce接口 不带参数

    最近对接了个webService的接口取数据,从网上良莠不齐的代码中找到了个方法, 具体作者已经记不住是谁了,现在把代码贴出来,希望可以帮到大家,代码如下,简单粗暴 public String get ...

  10. asp.net mvc4 简单使用Autofac依赖注入小结

    1,首先使用 NuGet下载适当的Autofac版本 文件一,Autofac.3.5.2 文件二,Autofac.Mvc4.3.1.0 1,接口类 public interface IReposito ...