AcFun 的视频架构演化实践——阅读心得
视频的核心技术栈
AcFun 弹幕视频网(acfun.tv)是中国最早上线的弹幕视频网站,也是最具影响力的弹幕视频平台。“AcFun”原取意于“AnimeComic Fun”。自2007年6月6日成立以来,AcFun 历经几年努力,从最初单一的视频站发展为现在的综合性弹幕视频网站,目前已是国内弹幕视频行业的领军品牌。
AcFun 从 2007 年建站,至2015 年正式专业化运营,从起初的盗链站,到如今由自身平台支撑绝大部分视频内容,伴随着业务的成长,技术架构也随之迅速演进,需要兼顾成本与用户体验,我们在视频存储转码、防盗链、媒体资源管理等领域进行过诸多尝试和变革,也乐于和大家分享在这过程中的思考和抉择。
视频主要由两部分组成,视频生产和视频消费端,A 站视频上传和存储、转码、内容的审核监控对生产方非常重要。播放器、CDN、宽带和防盗链后面会给大家介绍。
视频生产
A 站上的内容绝大多数是 UGC 的内容,UP 主(上传视频的人,搬运工)上传视频的体验,直接会影响网站内容的数量和质量,如果上传体验太差,UP主不愿意上传视频了,那离闭站也不远了。
视频消费方在 CDN 加速方面用得比较多,用户进行加速。但是 CDN 还有一个上传加速的功能,七牛有一种反向 CDN 加速的服务。这种服务的好处就是用户先上传到CDN 厂商,回调告诉我们,再从 CDN 厂商把视频拿过来,节省了用户时间。A 站和 CDN 厂商进行协调,可以用单线和双线的机房把视频文件拖到自己的存储上,这样降低了一些带宽的成本。
视频转码方面,实际上A站并没有自己的转码服务,而是和 CDN 厂商合作,用他们来进行转码。现在支持的视频格式有FLV、MP4,码率有标清480P、高清720P、超清1080P和原画。在视频转码方面有一些策略和针对A站的情况进行优化,比如说 A站有音乐区,这部分的用户更关注音质,对图片要求不是特别高,A 站会针对这一部分视频进行音质的保持和无损。大家对于舞蹈区的视频主要看萌妹子,如果是朱军画质那宅男们就要骂街了,当然要尽量保持超清原画质的视频。
曾经视频是没有切片的,一个视频不管多大,转完码后都是单一文件。现在通过调整转码方案,采用视频切片技术,这样有助于节约带宽,视频缓存的时候一段一段的缓存,不像之前全缓存到本地,有可能用户只看了一半就不看了,这样无疑浪费了带宽,无形中提高了公司的成本。而且切片转码能提高转码的速度。有利有弊,提高了播放器的开发成本,现在还存在一些问题。比如,到切换分片
的时候,有几率产生回退几秒的情况。用户体验十分不好。
因为 A 站内容以 UGC 为主,因此会有大量的政策风险,需要有一套完整的审核监控流程,举报机制来完善。如图2所示,这是一个简单的流程,用户上传视频之后,发现不符合的可以进行退稿,如果视频通过,用户看这个视频特别不舒服也会进行举报,举报到一定的次数之后,系统会自动的把稿件退掉,UP 主可以申诉。
视频消费
带宽的价格和 CDN 价格很高,所以A站在播放端想加入 P2P 技术,这样可以节省很多带宽,用户之间进行数据的传播。其他的网站上防盗链都有很大的一个技术团队支撑,A 站是刚起步的阶段,现在介绍几种防盗链的措施。
首先是在接口层做一些防范,然后在播放的时候,播放器会拿播放地址,防止他们抓取播放地址,就会用一些简单的措施,比如说去判断一下请求来源,判断 http 请求的 refer 还有 UA。还有一种是和 CDN 厂商联合做防盗链的一些措施,比如说播放地址的时效性,20分钟、30分钟等等,有效的防止盗链的情况。
关于 AcFun 下一段的路程还是很长的,A 站要尽快提高技术水平。A 站的定位并不是简单的视频网站,现在想往综合性网站上发展,不会投入太多的成本做所有事情,A 站积极寻求与第三方合作。比如说推送、图片、统计服务都是和第三方进行合作的,会寻求市面上最好的服务支撑网站的功能。
原文地址:https://mp.weixin.qq.com/s?__biz=MjM5NzAwNDI4Mg==&mid=2652190112&idx=2&sn=cc04b68076fe8a81ec1055bc14f67a3b&scene=21#wechat_redirect
AcFun 的视频架构演化实践——阅读心得的更多相关文章
- Airbnb架构要点分享——阅读心得
目前,Airbnb已经使用了大约5000个AWS EC2实例,其中大约1500个实例用于部署其应用程序中面向Web的部分,其余的3500个实例用于各种分析和机器学习算法.而且,随着Airbnb的发展, ...
- ArchSummit分享 | 高德地图App架构演化与实践
讲师介绍 郝仁杰,高德地图无线开发专家.在7月13日落幕的2019年ArchSummit峰会上就高德地图近几年的App架构演化和实践进行了分享. 背景概述 高德是国内领先的数字地图内容.导航和位置服务 ...
- 转: Android 后台任务型App多进程架构演化
评注:android 后台分进程保活方式的实践 Android 后台任务型App多进程架构演化 字数1621 阅读2790 评论8 喜欢35 什么是后台任务型app 类似音乐.录音机,需要用户长时间在 ...
- 七牛云赵之健:多维度融合赋能视频 AI 的实践
6 月 30 日下午,赵之健在七牛架构师实践日第二十九期进行了<多维度融合赋能视频 AI 的实践>为题的实战分享. 作者简介: 赵之健,七牛人工智能实验室资深算法工程师, 七 ...
- 基于AWS的云服务架构最佳实践
ZZ from: http://blog.csdn.net/wireless_com/article/details/43305701 近年来,对于打造高度可扩展的应用程序,软件架构师们挖掘了若干相关 ...
- 达达O2O后台架构演进实践:从0到4000高并发请求背后的努力
1.引言 达达创立于2014年5月,业务覆盖全国37个城市,拥有130万注册众包配送员,日均配送百万单,是全国领先的最后三公里物流配送平台. 达达的业务模式与滴滴以及Uber很相似,以众包的方式利 ...
- 一套高可用、易伸缩、高并发的IM群聊架构方案设计实践
本文原题为“一套高可用群聊消息系统实现”,由作者“于雨氏”授权整理和发布,内容有些许改动,作者博客地址:alexstocks.github.io.应作者要求,如需转载,请联系作者获得授权. 一.引言 ...
- QPS从0到4000请求每秒,谈达达后台架构演化之路(转载)
https://blog.csdn.net/czbing308722240/article/details/52350219 QPS从0到4000请求每秒,谈达达后台架构演化之路 达达是全国领先的 ...
- App架构师实践指南五之性能优化二
App架构师实践指南五之性能优化二 2018年07月30日 13:08:44 nicolelili1 阅读数:214 从UI和CPU方面来说App流畅体验优化,核心为流畅度/卡顿性能优化. 1.基 ...
随机推荐
- ES6对数组的增强
来看数组的改变,Array.from()可以将类数组对象变为数组: Array.of方法用于将一组值,转化为数组: 寻找数组中是否拥有某项find().findIndex(),里面要放置回调函数: 要 ...
- FlowPortal BPM流程中调用封装好的API如何调试
遇到复杂一点的业务,我们常常都会将业务逻辑封装到一个dll中,在流程中调用封装好的API. 业务逻辑库封装到企业库后,是可以在Visual Studio中调试库的哦. [附加到进程] [流程中调用AP ...
- 为什么需要 RPC 服务?
链接:https://www.jianshu.com/p/362880b635f0 在传统的开发模式中,我们通常将系统的各个服务部署在单台机器,随着服务的扩展,这种方式已经完全无法满足系统大规模的扩展 ...
- iptables网络防火墙和SNAT原理实战
网络防火墙 iptables/netfilter网络防火墙: (1) 充当网关 (2) 使用filter表的FORWARD链 注意的问题: (1) 请求-响应报文均会经由FORWARD链,要注意规则的 ...
- 主板(motherboard)
若转载请于明显处标明出处:http://www.cnblogs.com/kelamoyujuzhen/p/8979262.html 整台PC都是围绕主板(motherboard)构建的,它是PC中最重 ...
- idou老师教你学Istio 09: 如何用Istio实现K8S Ingress流量管理
前言 在Istio的世界里,如果想把外部的请求流量引入网格,你需要认识并会学会配置Istio Ingress Gateway 什么是Ingress Gateway 由于Kubernetes Ingr ...
- Paper Reading:ION
Inside-Outside Net (ION) 论文:Inside-Outside Net: Detecting Objects in Context with Skip Pooling and R ...
- 一篇文章教你如何部署.NET Core WPF应用,你还在等什么?
DevExpress广泛应用于ECM企业内容管理. 成本管控.进程监督.生产调度,在企业/政务信息化管理中占据一席重要之地.通过DevExpress WPF Controls,您能创建有着强大互动功能 ...
- 更改ejs模板引擎的后缀为html
安装 EJS 在项目目录右键->Open Command Prompt Here 输入 npm install ejs 打开app.js //app.set('view engine', 'ja ...
- js 获取窗口大小
//获得窗口大小 function findDimensions() //函数:获取尺寸 { var point = {}; ...