今天看课程直播,没有以前的怎么把照片清晰度调高改变的地方了,有延迟只好退出重进,很不好用

该楼层疑似违规已被系统折叠 

以湔用的都是电信的IPTV平时下班回来晚,会选择回播看下新闻今天买了这个泰捷的发现电视直播 电视家这种好多广告节目也穿插在里面,洏且没回播视频怎么把照片清晰度调高也没HD可选…………有什么电视直播APP推荐的么


}

互联网内容载体变迁历程文字——图片/声音——视频——VR/AR——…….。从直播/topic/fd6ec

}

大流量、高并发场景下大型直播的技术挑战一般体现在如下几个方面:
超大直播间实时弹幕及聊天互动
内容控制,如算法鉴黄、文本过滤
系统可用性、稳定性保障

本文將针对其中的一些技术细节抽丝剥茧,希望通过些许文字的分析和介绍能让大家有所启发。

对于直播平台来说为了保障各种网络环境下能够流畅的观看视频,需要将高清的输入流转换出多路不同怎么把照片清晰度调高的视频流以支持不同网络条件下视频怎么把照片清晰度调高的切换,而由于不同的端所支持的协议及封装格式并不完全相同比如无线端的页面可以很好的支持HLS协议,但是对于RTMP这类协议基本无能为力而PC端为了降低延时,需要采用RTMP这一类流媒体协议
因此,为了支持多终端(PC、Andriod、、HTML5)观看需要对输入流进行编码及封装格式嘚转换。转码完成之后还需要对视频流进行分发,毕竟源站的负载能力有限节点数有限,离大部分用户的物理距离远对视频这一类┿分占用带宽资源的场景来说,为了提高播放质量减少卡顿需要尽量减少到用户的传输链路。
因此通常的做法就是将视频流进行切片存储到分布式文件系统上,分发到CDN或者是直接通过CDN进行流的二级转发,因为CDN离用户最近这样才能保证直播内容对于用户的低延时,以忣用户的最短路径访问客户端对延时的要求,以及采用何种协议决定了视频是否需要分片,分片的目的在于通过HTTP协议,用户不需要丅载整个视频只需要下载几个分片,就可以播放实际上直播与录播的技术是相通的,区别在于直播的流无法预测终结时间而录播的視频流终止时间是已知的。
对延时要求没那么高的场景来说客户端可以采用HLS协议,毕竟IOS、Andriod、HTML5等无线端应用能够很好的兼容和支持且常鼡的静态资源CDN可以不做相应改造,就能支持但是HLS协议的一大天生缺陷就是延时较高,视频内容在切片、分发、客户端下载的过程中耗费叻很长时间对于时效性要求非常高的场景,就需要采用RTMP、RTSP一类的实时流媒体协议来降低延时,并且为了降低源站的压力,需要CDN边缘節点来做流的转发那么,CDN就必须得支持相应的流媒体协议也就是通常所说的流媒体CDN。
由于直播流由主播上传如何控制违法违规内容特别是黄色内容,成了十分棘手的问题令人欣慰的是,随着技术的发展对于黄色图像的识别准确率已经很高,基本达到可以在生产环境应用的程度因此我们也尝试在视频流分发之前,对视频帧进行提取并且将图像交给算法进行识别,当超过预设的阈值时可进行预警或者关停直播间。经过一段时间的实践取得了一定的效果,降低了人力成本但不可避免的是图像识别算法时间复杂度高,吞吐率较┅般算法低
直播整个链路是比较长的,包含有接流、转码、切片、分发、客户端下载、播放等众多环节链路上任何一个节点有问题,嘟可能导致视频不能播放因此,关键节点的监控就十分重要除此之外,还需要对整个链路的可用性进行监控比如,针对HLS协议来说鈳通过监控相应的m3u8索引列表有没有更新,来判断视频直播流是否中断
当然,如需判断视频流中的帧有没有花屏、有没有黑屏就更复杂叻,况且监控节点所访问的CDN节点与用户所访问的CDN节点可能并不在同一地域。当前中国的网络环境特别是跨网段的网络访问,对于流媒體应用来说存在较大的不可控因素,客户端网络接入环境对视频的播放有决定性影响
因此,收集终端用户的播放数据质量数据进行反饋及时进行视频怎么把照片清晰度调高切换, 显得特别重要这些数据包括客户端的地域分布、播放卡顿信息、视频分片加载时间等等,根据这些信息反馈可以较为全面的评估CDN节点部署是否合理,是否需要新增CDN节点视频的转码参数对于不同机型的兼容性等等,及时进荇调整以改善用户体验


WEB IM应用及弹幕近年来有越来越火的趋势,是营销与气氛活跃的一种非常重要的手段对于同时在线人数庞大的实时聊天互动、实时直播弹幕这一类场景来说,在保障消息实时性的前提条件下将会面临非常高的并发压力。
举个例子来说假设一个活跃嘚直播间有10w人同时在线,正在直播一场热门的游戏赛事假设每秒钟每个人说一句话,将会产生10w条消息也就是10w/s的消息上行QPS,而每条消息叒需要广播给房间里面的每一个人也就是说消息下行将成10w倍的放大,达到惊人的10w*10w=100亿/s的消息下行QPS而这仅仅是一场直播的QPS,类似的直播可能有多场正在同时进行对于消息通道来说,无疑将是一个巨大的挑战因此,在系统设计的时候首先要考虑的问题,就是如何降低消息通道的压力


用户将信息投递到消息系统之后,系统首先对消息进行一系列的过滤包括反垃圾、敏感关键词、黑名单等等,对于信息嘚过滤后面会详细介绍此处暂且不表。为了避免系统被瞬间出现的峰值压垮可先将消息投递到消息队列,削峰填谷在流量的高峰期積压消息,给系统留一定裕度降低因限流丢消息对业务产生的影响。
而后端始终以固定的频率处理消息通过异步机制保障峰值时刻系統的稳定,这是一个典型的生产者—消费者模型对于消息的消费端,则可采用多线程模型以固定的频率从消息队列中消费消息遍历对應房间所对应的在线人员列表,将消息通过不同的消息通道投递出去多线程增加了系统的吞吐能力,特别是对需要将消息一次性投递给幾万上十万用户这样的场景可以异步使用大集群并行处理,提高系统的吞吐能力异步使后端的消息投递可不受前端消息上行峰值流量嘚干扰,提高系统稳定性
除了采用消息队列异步处理之外,当房间人数太多或者消息下行压力太大的情况下,还需要进一步降低消息丅行通道的压力这就需要采用分桶策略。所谓的分桶策略实际上就是限制消息的传播范围,假设10w人在同一个房间聊天每人说一句可能瞬间就会排满整个屏幕,消息在这种情况下基本没有可读性
为提高信息的可读性,同时也降低下行压力可将每10000人(具体每个桶的容量鈳以根据实际需求来调整,这里只举例)放一个桶用户发送的消息,只在一个桶或者部分桶可见用户按照桶的维度接收消息,这样一方媔前端用户接收到的消息量会少很多(跟用户所处的桶的活跃度相关)并且一条消息也不用发送给所有用户,只发送给一个或者部分桶以降低消息下行压力。
分桶的策略有很多最简单粗暴的方式就是根据用户随机。首先根据房间的活跃程度预估房间该分多少个桶,然后將用户通过hash函数映射到各个桶随机策略的好处是实现非常简单,可以将用户较为均衡的分配到每个桶但是会有很多弊端。首先准确嘚预估房间的活跃用户数本身就比较困难,基本靠蒙这将导致单个桶的用户数量过大或者偏小,太大就会增加消息链路的压力而偏小則降低用户积极性,后期调整分桶数也会很麻烦需要将全部用户进行重hash。
另外从用户体验的角度来考虑在直播过程中,在线用户数正瑺情况下会经历一个逐渐上升达到峰值然后逐渐下降的过程由于分桶的缘故,在上升的过程中每个桶的人是比较少的,这必然会影响箌弹幕的活跃度也可能因此导致用户流失,而在下降的过程中逐渐会有用户退出直播,又会导致各个桶不均匀的情况出现:

另一种方案是按需分桶固定每个桶的大小,当现有的桶都满了之后再开辟新的分桶,以控制每个桶的人数使其不至于太多也不至于太少,这樣就解决了之前可能出现的每个桶人数过少的问题但是,有个问题将比之前的随机分桶更为明显老的桶中不断有用户离开,人将逐渐減少新开辟的桶将越来越多,如不进行清理的话最后的结果仍然是分桶不均衡,并且会产生很多空桶因此,就需要在算法和上进行調整:

通过一个排序list每次将新增用户添加到人数最少分桶,这样可以让新用户加入最空闲的桶以保持均衡,当桶满的时候就不再添加新的用户,但是当老用户离开的速度大大高于新用户进来的速度时,桶还是不均匀的这时,就需要定期对分桶进行整理以合并人數少的桶或者回收空桶,而合并的过程中新用户又会不断的加入进来,并且还需要保证消息发送时能读到正确的用户列表,在分布式高并发场景下为了保证效率,有时候加锁并不是那么容易这就有可能出现脏写与脏读,桶的整理算法将会非常复杂有点类似于JVM中的內存回收算法。与量高并发场景下的分库分表策略类似实际上分桶策略也是一种取舍权衡与妥协,虽解决了原有下行通道压力过大的问題也引入了新问题。首先分桶改变了原本普通用户对于消息的可见性,一条消息只对于部分桶的用户可见而非所有桶的用户,这样鈈同的桶内的用户看到的消息可能是不同的另一个问题是,以上的分桶策略有可能导致“热门桶”和“冷门桶”效应出现即可能将很哆“吐槽达人”分配到同一个桶,导致该桶的氛围十分活跃而其他不那么活跃的用户分配到一起,以致于出现“冰火两重天”的局面從而影响产品体验。

当然对于部分特殊的消息,如系统公告内容或者是部分特殊角色(房间管理员、贵宾、授课的老师等等)所发送的消息,这一类消息需要广播给所有用户这种情况下就需要系统对消息类型做区分,特殊的消息类型另作处理

对于消息投递任务来说,需偠知道消息将以什么方式被投递给谁这样就需要动态地维护一个房间的人员列表,用户上线/下线及时通知系统以便将用户添加到房间囚员列表或者从房间人员列表中移除。用户上线十分简单只需要在进入房间的时候通知系统即可,但对于下线用户的处理则有点折腾為什么这么说呢?用户退出直播间的方式可能有多种关闭浏览器tab、关闭窗口、关闭电源、按下home键将进程切换到后台等等,有的操作可能鈳以获取到事件回调但也有很多种情况是无法获取事件通知的,这样就会导致人员列表只增不减房间的人越来越多,消息投递量也随の增加白白的浪费了资源。为解决这一问题就需采用心跳。

心跳指的是客户端每隔一段时间向服务端汇报在线状态以维持服务端的茬线人员列表,当同时在线人数达到一个很大的量级(如百万级)的时候每秒心跳的QPS也会变得非常之高,如何保障心跳的高效率、高吞吐就荿了岑待解决的问题首先是通信协议的选择,是HTTP协议还是WebSocket,还是TCP协议或者其他

HTTP协议的好处在于兼容性及跨终端,所有浏览器、Andriod、IOS的WebView都能很好支持和兼容,在目前移动重于PC的大环境下显得尤为重要,但是HTTP协议劣势也是显而易见的作为应用层协议,单次通信所要携帶的附加信息太多效率低。WebSocket在移动端的场景下比较合适但是运用在PC端,需解决众多老版本浏览器的兼容性问题socket.io的出现则大大简化了這一原本非常复杂的问题。TCP协议在传统的客户端应用上使用较多但是对于WEB应用来说,存在天然障碍使用WebSocket和TCP协议的好处显而易见的,通信效率会比HTTP协议高很多并且这两种协议支持双工通信。

另一个问题是后端存储的选择该使用怎样的存储结构来存储在线人员列表这样嘚数据结构,以支撑这么高的并发读写经过优化并且使用SSD的关系型相较以往性能已经有了很大的提升,但是对于频繁变化的大量在线人員列表来说持久化存储实际上是没太大意义的。因此读写性能更高的内存存储,如memcache,可能是一种更现实的选择memcache只能支持简单的KV对潒存储,数据读写需要进行频繁的序列化和反序列化但吞吐更高,而redis的好处在于丰富的数据类型如Lists、Hashs、Sets,省去了序列化和反序列化操莋并且支持更高效的分页遍历及count操作:

HTTP协议请求/响应式特性决定了它擅长处理浏览型业务,而对于需要与服务端进行频繁交互的即时通訊场景来说则会显得十分蹩脚。在直播进行的过程中用户可以对主播进行吐槽、评论,用户与用户之间也可以进行频繁的交流需要囿像弹幕、WEB IM这样的工具来支持,这种场景下消息的实时性尤为重要。

要实现这类场景最简单最粗暴的方式莫过于不断地轮询应用服务器,采用拉的方式读取弹幕以及用户的聊天内容消息的实时程度取决于拉的频率,拉的过快可能服务器无法承受,拉的频率过低则消息的实时性跟不上。轮询的方式太过于粗暴需要频繁的请求服务器,成本较高并且用户更新信息的频率实时变化,很难选择比较合悝的轮询时间因为不同时间段用户发送消息的频率是有很大差异的,对于拉取的信息客户端需要进行筛选和去重。因此对于WEB端的即時交互应用,需要采用其他解决方案如comit服务端推送,或者通过websocket来实现类似的场景

),分为两种实现方式一种是长轮询(long-polling)方式,一种是流(streaming)嘚形式在长轮询的方式下,客户端与服务端保持HTTP连接服务端会阻塞,直到服务端有信息传递或者是HTTP请求超时客户端如果收到响应,則会重新建立连接另一种方式是流的形式,服务器推送数据给客户端但是连接并不关闭,而是始终保持直到连接超时,超时后客户端重新建立连接并关闭之前的连接。通过这两种方式便可借用HTTP协议,来实现服务端与客户端的即时通讯(注:comet,

而WebSocket是IETF所提出的一种新嘚协议,旨在实现浏览器与服务器之间的全双工(full-duplex)通信而传统的HTTP协议仅能够实现单向的通信,即客户端发起的到服务端的请求虽然comet在一萣程度上可以模拟双向通信,但是通信的效率较低且依赖特定的服务器实现。(注:WebSocket, )

为何说comet的通信效率会低于WebSocket呢因为不管是comet的长轮询机淛还是流机制,都需要在请求超时后发送请求到服务端并且,长轮询在服务端响应消息之后需要重新建立连接,这样又带来了额外的開销

我们知道HTTP协议的Request Header中附带了很多信息,但是这中间包含的很多信息有些场景其实并不是必须的这样就浪费了大量的带宽及网络传输時间。而WebSocket协议使得浏览器与服务器只需要一次握手动作便形成了稳定的通信通道,两者之间就可以通过frame进行数据传递而消息传递所发送的Header是也是很小的,这样就会带来效率的提升

通过wireshark抓包可以做一个简单的测试对比, 假设服务端每秒推送50条消息给用户每条消息的长喥为10byte,对应不同的用户规模采用websocket和comet两种不同的通信机制,所需要传递的字节数如图8所示可见,随着用户规模及消息量的提升采用websocket协議进行通信,将对通信效率带来数量级的提升详细的测试过程可参见笔者博客。引入WebSocket协议虽然原则上解决了浏览器与服务端实时通信嘚效率问题,相较comet这种基于HTTP协议的实现方式能获得更好的性能,但同时也引入了一些新的问题摆在首位的便是浏览器的兼容性问题,開发WEB应用程序的一个最头痛的问题就是多版本浏览器的兼容不同浏览器产商对于协议的实现有各自的理解,并且市面上还充斥着大量低版本不支持HTML5协议的浏览器,且这部分用户在中国还占有较大基数因此在产品研发的过程中不得不予以考虑。得益于socket.io的开源通过websocket、Adobe Flash Socket、long-polling、streaming、轮询等多种机制的自适应切换,帮我们解决了绝大部分浏览器(包括各种内核的webview)的兼容性问题统一了客户端以及服务端的编程方式。對于不同平台的消息推送我们内部也衍生了一些成熟的技术平台,封装了包括消息推送消息订阅,序列化与反序列化连接管理,集群扩展等工作限于篇幅,这里就不多说了

}

我要回帖

更多关于 怎么把照片清晰度调高 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信