请尊重分享成果,转载请注明出处,本文来自逆流的鱼yuiop,原文链接:
http://blog.csdn.net/hejjunlin/article/details/72860470

经常会看到,很多公司都在带宽和卡顿中抉择,想把H.265编码格式做为视频编码格式普及开来,用于客户端播放,无论在TV上,还是手机上,由于很多设备不支持这种编码格式,所以往往要做适配。有人问,为什么大家都在说切H.265?

H.265是ITU-T VCEG 继H.264之后所制定的新的视频编码标准。H.265标准围绕着现有的视频编码标准H.264,保留原来的某些技术,同时对一些相关的技术加以改进。新技术使用先进的技术用以改善码流、编码质量、延时和算法复杂度之间的关系,达到最优化设置。具体的研究内容包括:提高压缩效率、提高鲁棒性和错误恢复能力、减少实时的时延、减少信道获取时间和随机接入时延、降低复杂度等。H264由于算法优化,可以低于1Mbps的速度实现标清数字图像传送;H265则可以实现利用1~2Mbps的传输速度传送720P(分辨率1280*720)普通高清音视频传送。

回到商业目的本质上来,就是省带宽。在有限带宽下传输更高质量的网络视频。这就是相比于H.264最突出的。当然还有有些在算法优化上,更高效。最终都是省带宽。打个比方理解,原来10M带宽,可以传输1T的网络视频,现在用H.265编码格式,可以传输2T的同等清晰度的网络视频。要用H.265来做编码格式,其代价就是设备计算能力:H.265编码的视频需要更多的计算能力来解码。所以,经常看到手机发烫,电视盒子发烧,手机更加耗电。因为会把CPU一下飙起来。前面都是闲话,今天总结下如何快速起播直播流。直播行业流传一句话,现在的直播应用,没有混到秒开,都不意思,说自己搞直播的。这句话不是没有道理的。

对于直播来讲,它是一个流,它不像点播,大家都从0秒开始,任何一个视频文件,0秒第一个帧肯定都是关键帧。那么对于直播来讲,是一个随机的时间点接到这个视频流进行播放,那么我接入的这个时间点的帧有可能拿到的第一个帧的数据是I帧,也有可能是B帧,也有可能是P帧。这是一个随机的。在这种情况下,我们大概率会出现一个黑屏的状态。因为我拿到的是个P帧,对于P帧来讲,解码器面那个Buffer是空的,它不知道这个P帧如何进行解码,所以它只能丢弃这个帧。

先来看一个花屏,解释参考帧丢失,I帧是关键帧,一个完整画面,可以独立解码,P帧,是前向预测编码帧,可以理解为运动补偿帧,根据关键帧+运动补偿预测下一个关键帧。B帧,是双向预测编码帧,也是用来预测修补下一个I帧,所以B帧,P帧统称为参考帧。如 I P P B I 如下

视频流是1080*1920分辨率的。用1080*720的,没有任何问题。猜测如下原因:

  • 同一种视频封装格式,分辨率越小,花屏现象越少。
  • 分辨率越小,服务端发送给客户端的数据越小,其花屏现象越少,说明花屏现象与服务端发送的数据量有关。
  • 可能的原因是服务端发送的数据量较大时,客户端缓冲区不足,导致数据丢失的问题,从而引起花屏现象。

对于直播来讲,我一秒钟的帧数是固定的,只能等到我下一个关键帧到来的时候,我才能开始去播放。当然正好赶巧了的话,接入那瞬间得到的数据正好是个I帧。就可以达到秒开的效果。

服务端优化,CDN 预缓存 GOP,以高倍速推送,缩短I帧等待时间:

  • 在直播服务器中,支持设置一个cache,用于存放GOP(就是I/P/B组起来的),客户端播放。
    直播服务器缓存了当前的GOP序列,当播放端请求数据的时候,CDN会从I帧返回给客户端,从而保证客户端可以快速获取I 帧进行显示;当然,由于缓存的是之前的视频信息,当音频数据到达播放端后,为了音视频同步,播放器会进行视频的快进处理(也就是赶上,据说百度视频云,在~“赶上”~这块,还专门写了专利),但这种影响很小;相比于能够达到“秒开”的效果,这个代价是值得的;

播放端优化:

  • DNS解析加快,通常,DNS解析,意味着要把一个域名为xxx.com解析成ip过程,平时请求网页,网络差,就会打开网页半天。
  • 修改播放器逻辑,基于FFmpeg二次开发,FFmpeg起播视频,都是拿到视频完整信息,才起播。能不不能只拿到部分信息,就起播。就要修改代码了。通常FFmpeg起播时,finder_decoder, avformat_find_stream_info较耗时,前者去找解码器,相对后者,又不那么耗时,凡事都有相对。在avformat.h声明。在libavformat\utils.c中实现如下:

    finder_decoder:

    avformat_find_stream_info:

    这里优化后者,主要修改两个参数,一个是 probesize,一个是 analyzeduration,分别用来控制其读取的数据量大小和时长。减少 probesize 和 analyzeduration 可以降低avformat_find_stream_info 的函数耗时,达到起播快。

如果是基于ijkplayer二次开发的,不用修改c层,直接在ijkVideoView.java中,也可以作相应修改。

注意:修改任何参数,都是有代价的,要视具体情况。这个值修改,大小,可能播不起来,这种情况就坑了,如果是先有画面,在有声音,音画不同步。

还有一些方法如,播放端识别首个关键帧即启动播放,或者通过减小GOP间隔来提高加载速度;也是可以达到的。

优化是一个渐进的过程,从表面显而易见的开始,逐步拆解流程,找到可能的优化点,对这些点逐个分析,找到性能瓶颈,然后想办法解决。当然优化有时也需要权衡代价和效果,重点先解决性价比比较高的优化点。

第一时间获得博客更新提醒,以及更多android干货,源码分析,欢迎关注我的微信公众号,扫一扫下方二维码或者长按识别二维码,即可关注。

如果你觉得好,随手点赞,也是对笔者的肯定,也可以分享此公众号给你更多的人,原创不易

直播技术总结(五)如何快速起播直播流相关推荐

  1. 双11直播技术强力后盾——阿里云导播服务功能详解与场景应用

    最早的双11购物节是从2009年淘宝开始,历经8年的洗礼,现在双11已经演变成全球范围内所有线上线下商家和消费者的购物狂欢节,今年的天猫双11以1682亿元的交易额圆满收官,再次打破去年的记录. 直播 ...

  2. 《视频直播技术详解》系列之八:直播云 SDK 性能测试模型

    七牛云于 6 月底发布了一个针对视频直播的实时流网络 LiveNet 和完整的直播云解决方案,很多开发者对这个网络和解决方案的细节和使用场景非常感兴趣. 结合七牛实时流网络 LiveNet 和直播云解 ...

  3. 字节腾讯阿里罕见联手:发布直播技术新标准,要让手机直播像电视一样丝滑...

    明敏 发自 凹非寺 量子位 | 公众号 QbitAI 字节.阿里.腾讯3家大厂联手搞了件大事: 把传统直播3-6秒的延迟,直接拉低到1秒内大关,最低可到500毫秒的那种. 就在最近,火山引擎与阿里云. ...

  4. 视频直播技术分享:一文读懂主流视频直播系统的推拉流架构、传输协议等

    本文由蘑菇街前端开发工程师"三体"分享,原题"蘑菇街云端直播探索--启航篇",有修订. 1.引言 随着移动网络网速的提升与资费的降低,视频直播作为一个新的娱乐方 ...

  5. 论视频直播技术破茧而出之道

    2016 年移动直播的爆发式发展,从生活.娱乐.商业化直播到企业实时视频会议,形式玩法多样,完全解放了 PC 端的场景限制.但受制于网络流量成本的压力,如何更进一步提高产品功能和稳定性也为了各大平台对 ...

  6. 视频直播技术详解(8)直播云 SDK 性能测试模型

    <视频直播技术详解>系列之八:直播云 SDK 性能测试模型 牛小七2016年10月12日发布在 视频直播技术详解 七牛云于 6 月底发布了一个针对视频直播的实时流网络 LiveNet 和完 ...

  7. python 项目发布会_发布会直播技术及业务实践

    一.背景 随着直播行业的近年来的发展,直播技术现已日趋成熟.本文主要介绍目前主流的直播技术原理,以及在直播在发布会场景下的应用以及过程中遇到的问题及解决方案. 二.直播原理 2.1 流媒体技术 2.1 ...

  8. 视频直播技术干货:一文读懂主流视频直播系统的推拉流架构、传输协议等

    1.引言 随着移动网络网速的提升与资费的降低,视频直播作为一个新的娱乐方式已经被越来越多的用户逐渐接受.特别是最近这几年,视频直播已经不仅仅被运用在传统的秀场.游戏类板块,更是作为电商的一种新模式得到 ...

  9. 淘宝直播技术分享:如何打造体验优秀的“直播+”产品?

    声明:本文为阿里投稿,版权为原作者所有. 2016年是移动直播爆发年,不到半年的时间内无数移动直播 App 掀起了全民直播的热潮.很多不同产品都在自己的应用里面增加了直播模块,希望能趁着这波移动直播的 ...

最新文章

  1. uboot中添加hi35xx的GPIO设置
  2. ADSL+NAT配置实例
  3. C#[Serializable]在C#中的作用-NET 中的对象序列化
  4. Metasploit+python生成免杀exe过360杀毒
  5. VTK:可视化算法之PineRootConnectivity
  6. java基础---IO字符流
  7. /usr/lib/python2.6/site-packages/pycurl.so: undefined symbol: CRYPTO_set_locking_callback
  8. [luoguP2221] [HAOI2012]高速公路(线段树)
  9. 打印一种拓扑排序(假定给的是有向无环图时)DFS+栈
  10. 什么是用户故事 (User Story)?
  11. 低版本浏览器如何兼容html5,解决Vue兼容低版本浏览器的简单方法
  12. 多进程爬取Unsplash网站图片
  13. Bluedroid 函数分析:bta_dm_gattc_register
  14. C语言实现万年历记事本,简单的日历记事本jQuery插件e-calendar(带样式美化)
  15. linux怎么进入系统安装界面,Linux图形化界面安装全过程
  16. 前字节程序员感叹“字节范”就是工作上不设边界,待遇上延迟满足。
  17. 【本人秃顶程序员】Java程序员,你会选择25k的996还是18k的965?
  18. win10 2016企业版激活,遇到非核心版本的计算机问题
  19. Cell Stem Cell | 杨东赫等建立全面的人类胚胎心脏多谱系发育图谱
  20. 计算机基础---学习笔记

热门文章

  1. 动态显示图片 Js + html
  2. PE结构详解(加壳脱壳必备知识)第二篇·存储地址介绍
  3. python三引号怎么打出来_python的三引号
  4. eclipse导入web项目之后会报一大堆错误
  5. SaaS | 金山软件西山居游戏工作室
  6. Linux鸟哥的私房菜—1
  7. 软件测试 录制回放,软件测试之录制与回放.ppt
  8. 锐捷网管系统漏洞利用分析
  9. 2023年全国最新交安安全员精选真题及答案8
  10. 2021年南京大学计算机科学与技术学院考研指南