视频播放分为了录播和直播。
录播就是事先录制好视频,等录制完成后,上传到服务器上,共观众观看。比如绝大多数的电视节目,还是就是视频网站提供的视频。
录播的好处:
录播的坏处:
直播是指人们可以通过网络收看到远端正在进行的现场音视频实况,比如赛事、会议、教学、手术等等。 直播进行时,主播可以跟观众进行实时互动,直播结束后,还可以随时为观众提供重播、点播服务,发挥直播内容的最大价值。
直播就是为了弥补录播不能进行实时互动的这个短板。但是直播对主播的要求非常高,因为这是互动,主播要应对各种复杂的情况, 主播需要有很好的临场反应能力和一直互动下去的能力。
直播平台的收入主要有广告收入、用户打赏(用户花钱购买礼物、道具等打赏给主播)、与游戏公司及外设厂商进行合作等。
2016年4月18日,《北京网络直播行业自律公约》开始施行。公约要求:
一个完整的直播过程,包括采集、处理、编码、封包、推流、转码、分发、拉流、解码、播放。
从推流到播放,中间所有环节的延迟越低,用户体验越好。
直播涉及到的技术非常多,而且有很多的壁垒、瓶颈。所以出现了一些专门做直播技术的整体解决方案提供商。
下面是一些国内常见的直播技术的整体解决方案提供商:
直播过程中,送主播礼物是很多直播平台的主要收入。直播的礼物通常分为两大类:红包和虚拟物品。
与微信红包是类似的。
红包的实现很简单,调用第三方支付接口或者SDK
即可实现。
下面是花椒直播的红包实现:
虚拟物品也有两种:一种是静态的,一种是动态的。
比如下面的这些礼物:
静态的虚拟物品,每个礼物就是一个静态图片。
由于手机端内存非常有限,我们必须要控制好图片的加载,否则很容易出现OOM
,通常需要设计缓存,一般都是比较复杂的, 幸好有很多开源的库可以直接使用。
Android
中常用的图片加载器:
iOS
中常用的图片加载器:
曾几何时,为了网络传输速度,在Web
前端中大多使用JPG
静态图片。 因为JPG
的压缩率非常的高,但缺点也是有的,就是不支持透明通道,而且他是有损压缩,对于要求不高的情况可以使用。 但是随着移动App
的普及,对图片的要求也变高,刚开始大家都使用PNG
格式的图片,PNG
是支持透明通道,并且是无损压缩的,体积太大了,占用内存过高,所以一些公司探索开发新的图片编码技术。比如Google
就开发出了WebP
格式,并将它开源,而且也整合到了Android
操作系统中了, 其他端的编解码都是开源的。目前,图片格式大多采用WebP
。
如果图片格式不采用WebP
,通常会使用一些图片压缩工具对图片进行压缩处理。
PC
上常用的图片压缩工具:
Android
上常用的图片压缩工具:
比如下面的这些礼物:
对于动态虚拟物品,可以是一些尺寸比较小的动态表情之类的,还有一些是尺寸非常大的,比如跑车、飞机、航母之类的。 还有一些可能是非常酷炫的特效,比如漂浮的点赞之类的。
对于动态的虚拟物品的本质,就是动画。这依赖于每个技术平台(Android、iOS、ReactNative、Web前端)的实现。
FlashAnimationToMobile这个库支持解码和展示Flash
,支持Android
和iOS
, 不过Flash
基本上要全面退出历史舞台了,很少有公司再使用Flash
了。
无论是Android
还是iOS
原生操作系统都对gif
支持的比较弱。
android-gif-drawable这个库支持Android
上的解码和展示gif
图片。
Android
、iOS
、Web
前端都是支持SVG的, 只是SVG是用XML
描述的,效率上不太好。对于一些简单的动画可以使用它。
Android5.0
中增加了VectorDrawable
和AnimatedVectorDrawable
, 用以支持SVG。
SVG
在Web
前端中使用的比较广泛。
Android
上的帧动画从一开始就支持,使用AnimationDrawable
实现。
iOS
上的帧动画从一开始就支持,使用UIImageView
实现,注意:不是用CAKeyframeAnimation
实现。
Web
前端的动画实现方式有transition和animation, 对于直播礼物来说,显然我们是使用animation来实现的, 因为animation使用的是关键帧(一帧一张图片)技术。
在Android
和Web
前端中可以使用Canvas
进行绘制,尤其是在Web
前端中, 现在一些比较酷炫的动画是使用Canvas
技术开发出来的,当然一般不直接使用Canvas
,而是使用封装好的一些API
。
在iOS
上使用CALayer
进行绘制。
使用Canvas
绘制给客户端开发造成了很大的工作量,而且在Android
和iOS
为了实现动态部署, 需要配合上热跟新技术,难度也是非常的大。
将动画分解成多张图片,有一个配置文件保存这些图片播放时候的先后顺序、相邻两张图片的时间间隔、图片显示位置、是否可以循环播放等相关信息。 然后将这些资源打包成ZIP
格式,客户端下载这些压缩包、解压、缓存、使用各自端的帧动画展示。
这种自由度大,但是缺点是对客户端要求有一定的难度,因为必须设计的合理,一开始要想到很多东西。