十亿级视频播放技术优化揭密 - 掘金

网易云音乐在视频播放优化上的实践 - 知乎

HLS 视频点播初探 - 腾讯云开发者社区-腾讯云

HTTP Live Streaming(HLS)是苹果公司实现的基于HTTP的流媒体传输协议,可实现流媒体的直播和点播。原理上是将视频流分片成一系列HTTP下载文件。特点是将流媒体切分为若干 TS 片段(比如每10秒一段),然后通过一个扩展的 m3u 列表文件将这些 TS 片段集中起来供客户端播放器接收。

首帧优化

首帧时间,即从开始播放到视频第一帧渲染到屏幕上的时间。要对首帧耗时进行优化,我们需要搞清楚这其中包含哪些步骤。这个过程依次分为以下几步:

1. DNS解析,通常一个App内视频资源的域名是固定的一个或几个,所以只有第一次播放需要请求域名服务器解析域名,后面都只需要直接到缓存里面去取就可以了。

2. 域名解析完之后,首先要发起TCP连接,这个时间受网络状况影响。

3. 然后发起Http请求,等待Http数据的返回,这个也会受到网络情况的影响。

4. 数据返回之后,播放器首先要对视频格式进行探测,而且需要足够的数据量才能探测成功。

5. 格式探测完也是不能直接播放的,播放器需要拿到足够多的数据缓存才能开始播放视频,开始播放的缓存量有一个阈值是可以设置的。

6. 最后一步就是对视频数据的解码,这个耗时由播放器本身的性能决定。

通过上面的分析,首帧耗时主要由DNS耗时+TCP连接耗时+Http请求耗时+视频探测耗时+buffer缓存耗时+播放器解析耗时累加而成。其实,从整个过程来看,App层面可以做的并不多。我们考虑从其他角度来优化首帧时间。

网络优化

对于播放体验和播放错误的改进,网络的优化也是不可或缺的一部分。

首先,域名解析的耗时本身会影响视频首帧时间,也可能会由于解析失败导致视频播放出错。因此,云音乐使用了HttpDns来代替默认的域名解析,并且使用了批量域名预取,预埋一些默认的域名地址,当域名解析出错时,可以通过默认ip访问网络。

其次,对于视频数据的请求,需要先建立tcp连接,为了能够避免tcp连接建立的时间消耗,底层网络库里启用了tcp连接复用,在域名收敛的情况下,可以通过复用tcp连接来减少视频请求的时间。从而提升视频首屏速度。

最后,弱网也是我们无法避开的问题。弱网环境会存在请求超时,针对这种情况,我们会尝试多次重连。而且在网络库底层,在超时的情况下,也会超时连接其他ip。另外,对于多分辨率视频的情况,如果明确知道网络比较差的话,可以尝试提示用户切换到低分辨率来播放。

爱奇艺CDN调度系统全流程架构如下图: 

以下是 架构图中各个系统的角色介绍:

  • 客户端:爱奇艺提供的播放客户端,覆盖手机、平板、电脑、电视和网页等多个平台,客户端首先访问DNS解析HTTP视频调度域名,然后请求HTTP视频调度获取CDN下载地址,最后从CDN下载视频数据;

  • 探测服务器:一组开启双栈的HTTP服务器,为全网客户端提供探测服务,帮助客户端判断本地IPv4和IPv6可用情况;

  • Local DNS:客户端使用的DNS服务器地址,由用户所在运营商提供;客户端向Local DNS发起域名解析请求,Local DNS递归查询到爱奇艺Anycast DNS,最后把结果返回给客户端;

  • Anycast DNS:爱奇艺自研的高性能DNS系统,单机QPS可达近百万,基于Anycast技术部署,为全球用户提供高可用的DNS服务,支持IPv6后可提供IPv6 AAAA记录查询解析;

  • HTTP视频调度:CDN核心系统之一,根据客户端请求来源地址归属运营商和区域,为用户选择服务质量最优的CDN,确保用户享受极致播放体验;

  • 爱奇艺混合CDN:包括自建cdn和商业CDN,为爱奇艺数亿用户提供就近下载服务;

  • 资源管理平台(天工):资源统一管理平台,实现从资源需求收集、商务拓展、资源采购、资源部署、资源管理、基础运维和成本计算的统一管理,旨在打造以流程管理为基础的自动化运维平台;

  • 调度管理平台(伏羲):调度管理平台,管理DNS调度和HTTP视频调度各种配置和策略。调度管理平台从资源管理平台中自动同步机房和服务器基础信息,借助配置管理平台实现配置的快速下发和生效;同时支持通过域名和IP维度进行拨测,实时探测全网服务器健康状态,自动下线故障服务器;

  • 配置管理平台(Fast):作为CDN 服务器的管理平台,联动资源管理平台和调度管理平台等多个系统,同步资产和服务等基础信息。利用部署在多个运营商+区域的 Proxy 集群,保证全网 CDN 节点的连通率,提供稳定可靠的配置管理服务。

QQ空间视频优化:

1、流量控制

在高峰期播放到第10秒时,预下载N秒数据,下载到N秒就停下来。然后,可以做多级限速。一开始不限速,下载到合适时机做1倍码率限速。高峰期时预加载的数据会少一些,防止高峰期时带宽占用明显,这是初级的策略。最终我们也有码率切换的策略。

2、防盗链耗时优化

3、TS片下载优化

先从m3u8中,获取TS片段,然后并行下载TS

HLS在安卓上面体验非常差,因为安卓3.0之后对HLS基本没有做的优化工作,这里每次安卓上播放HLS需要等待6-9秒。分析发现它的处理也不是很得当,因为安卓系统请求链路较长,串行下载,需要下载3-4片TS才能启动播放,下载3个分片的话,耗时就会很久。先获取M3U8,解析M3U8里面有哪些文件,可以做并行下载,只让他下载一次M3U8,这样下载速度大幅度提升。

4、Seek文件空洞优化

对存储做了一次重构,支持文件空洞。会按照一兆的方式对文件进行碎片划分,好处是我可以分段存储,我可以允许逻辑空洞的,拖动的话也可以在后面存储,也不需要数据库,我可以知道这是从哪个位置到哪个位置的存储。

5、DNS劫持优化

下载常见的错误码,DNS劫持是比较多的,一些网络运营商会劫持你的请求。

这个在国内是比较常见的劫持,有的小运营商按月会劫持你的视频内容,可能直接污染你的DNS让你查找不到CDN,这是比较多的,还有一些网络不稳定的影响导致。更隐藏的会直接污染你的视频内容,让你视频内容是错误的。

第三部分:如何借助当前的自适应比特率技术降低广播延迟 – 视频播放器优化建议 | 亚马逊AWS官方博客

视频播放优化浅析 - 云+社区 - 腾讯云

面试:视频播放器相关优化参考相关推荐

  1. Android 设定横屏,禁止屏幕旋转,Activity重置 [更新视频播放器相关]

    1. 设定屏幕方向 当指定了屏幕的方向后(非SCREEN_ORIENTATION_UNSPECIFIED),屏幕就不会自己主动的旋转了 有2中方式控制屏幕方向: 1.1 改动AndroidManife ...

  2. 嵌入式Qt 开发一个视频播放器

    上篇文章:嵌入式 Qt开发一个音乐播放器,使用Qt制作了一个音乐播放器,并在OK3568开发板上进行了运行测试,实际测试效果还不错. 本篇继续来实现一个Qt视频播放器软件,可以实现视频列表的显示与选择 ...

  3. Html5酷播云视频播放器同层播放(代码实例)

    在Android手机上使用H5播放视频时,大多数的国内浏览器厂商都会在视频播放时劫持<video>标签,使用浏览器自带的播放器播放视频,而且播放器会处于最高层级,视频上面无法显示其它htm ...

  4. 基于Qt、FFMpeg的音视频播放器设计一

    前言:整个项目的源代码 https://download.csdn.net/download/hfuu1504011020/10672140 最近刚完成基于Qt.FFMpeg的音视频播放器相关C++程 ...

  5. 1.7 微信小程序-视频播放器-发送弹幕

    一.视频播放器 video-detail 视频播放器 select-color 发送弹幕 1. 页面制作 2. 选择弹幕颜色 2. Video插件的使用 3. 相关代码 app.json //app. ...

  6. 全景视频播放器中OpenGL的相关记录

    全景视频播放器中OpenGL的相关记录 一.OpenGL顶点数组 二.坐标系与投影 三.坐标系相关函数 四.纹理坐标 五.纹理过滤 六.深度缓冲区 七.OpenGL的glut库 OpenGL函数功能g ...

  7. oracle默认的优化器,Oracle优化器相关参数设置

    oracle优化器相关参数设置 Connected to: Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Prod ...

  8. FFmpeg开发(四)——Qt实现一个视频播放器(参考了暴风影音、迅雷影音)

    FFmpeg开发(四)--Qt实现一个视频播放器(参考了暴风影音.迅雷影音) 本系列文章目录: FFmpeg开发(一)一Qt Creator配置FFmpeg FFmpeg开发(二)--(FFmpeg基 ...

  9. iOS 教你使用MP、AVPlayer、AVPlayerVC构建一个完整的视频播放器

    1.前言 标题必须要浮夸!要感觉像是一个大新闻.长者如是说. 其实是前几天去面试的时候,被要求说必须做过视频播放相关项目.有点闹心之余,就花了点时间在家写了一个简单播放器,基本实现了主流播放器的大致功 ...

  10. 一步步自定义视频播放器——TextureView+MediaPlayer自定义视频播放器

    本篇参考封装一个视频播放器,原文已经写的非常棒了,本篇加入了个人对其内容的理解.秉承不重复造轮子的良好理念,接下来开始拆解轮子.内容非常多,我都差点放弃写,有耐心的请往下看 github上非常棒的视频 ...

最新文章

  1. 二十万字C/C++、嵌入式软开面试题全集宝典三
  2. 网页 html 全图片排版,HTML5-网页排版划分
  3. windows server 注意windows的temp目录
  4. 怎么用计算机弹出soldout,SOLDOUT2游戏新手攻略玩法全面介绍
  5. gmp计算机系统课件,EU GMP附录11计算机系统◆问答
  6. 103. 二叉树的锯齿形层次遍历/102. 二叉树的层序遍历
  7. Android 第二章 本地文件的读写
  8. 【Git】mac执行git命令出现xcrun: error: invalid active developer path解决方法
  9. 原型化系统---失物招领APP
  10. Applese 涂颜色(python解法)
  11. DLP Digital Light Procession 的缩写 数字光处理
  12. 产品读书《人类简史》
  13. Chrome 插件收集
  14. 信息学奥赛一本通:1041:奇偶数判断
  15. 移动端超高品质的Axure UI设计/交互设计组件库,几乎涵盖了所有的组件
  16. 最容易理解的Raft算法讲解
  17. Maya菜单中英文对照表(一)
  18. 用SQL语句向数据库添加date类型字段
  19. 更改win10管理员账户名称
  20. 使用Prometheus监控web站点及证书过期

热门文章

  1. 记录python量化投资学习过程(二)- 常见指标以及概念的记录
  2. 摘要认证 java_摘要认证及实现HTTP digest authentication
  3. Spring Security - 21 记住我功能
  4. coffe-script
  5. wifi+遥控器+android,基于安卓手机wifi的智能遥控器设计
  6. std::asio小记
  7. 超强学位论文检索工具,你必须拥有!
  8. 随机过程之平稳过程与各态历经过程
  9. 做外贸如何防止邮箱被封?已解决!
  10. Swiper去除点击选项卡时出现的蓝色边框和蓝色背景