视频直播

视频播放分为了录播和直播。

1.1、录播

录播就是事先录制好视频,等录制完成后,上传到服务器上,共观众观看。比如绝大多数的电视节目,还是就是视频网站提供的视频。

录播的好处:

  • 如果没录制好,可以进行重录,直到录制满意为止。
  • 录播可以随意选择时间。时间要求不严格。
  • 录播可以进行后期剪辑,增加一些东西进去,比如译文等。

录播的坏处:

  • 没法实时互动。比较死板。
1.2、直播

直播是指人们可以通过网络收看到远端正在进行的现场音视频实况,比如赛事、会议、教学、手术等等。 直播进行时,主播可以跟观众进行实时互动,直播结束后,还可以随时为观众提供重播、点播服务,发挥直播内容的最大价值。

直播就是为了弥补录播不能进行实时互动的这个短板。但是直播对主播的要求非常高,因为这是互动,主播要应对各种复杂的情况, 主播需要有很好的临场反应能力和一直互动下去的能力。

1.3、直播的内容
  • 在线游戏直播
    播放玩游戏。斗鱼直播虎牙直播
  • 娱乐活动直播
    一般都是有关科技、财经类话题、音乐会、晚会等。这种直播会画面的清晰度要求较高,需要分辨率高一些的屏幕。YY全名娱乐
  • 网红直播
    网红多是年轻、漂亮、活泼的美女。她们唱歌、跳舞、闲聊,吸引了很多电脑和手机屏幕前的观众。
  • 教育培训直播
    腾讯课堂就是以直播方式做的在线教育平台。
  • 电商直播
    天猫、京东等电商。
1.4、直播平台的收入

直播平台的收入主要有广告收入、用户打赏(用户花钱购买礼物、道具等打赏给主播)、与游戏公司及外设厂商进行合作等。

1.5、直播行业规范

2016年4月18日,《北京网络直播行业自律公约》开始施行。公约要求:

  • 主播实名制
    实名信息,包括姓名、身份证号码、手机号码、银行卡账户信息、本人手持身份证照片。同时, 申请者还需在与审核人员视频聊天过程中回答若干问题,审核人员认定申请者满足认证要求的予以认证,否则不予认证。
  • 主播黑名单
    网络直播平台对于停播封号的主播信息及违规视频进行证据保全,并上传至北京网络文化协会数据库。 这个黑名单库将起到关键作用,协会将名单发给各平台并上报文化主管部门,各平台在其停播封号期间不得为其提供直播空间。
  • 直播内容存储不少于15天备查。
1.6、直播过程

一个完整的直播过程,包括采集、处理、编码、封包、推流、转码、分发、拉流、解码、播放。

从推流到播放,中间所有环节的延迟越低,用户体验越好。

1.7、直播技术提供商

直播涉及到的技术非常多,而且有很多的壁垒、瓶颈。所以出现了一些专门做直播技术的整体解决方案提供商。

下面是一些国内常见的直播技术的整体解决方案提供商:

1.8、直播中的礼物实现方案

直播过程中,送主播礼物是很多直播平台的主要收入。直播的礼物通常分为两大类:红包和虚拟物品。

1.8.1、红包

与微信红包是类似的。

红包的实现很简单,调用第三方支付接口或者SDK即可实现。

下面是花椒直播的红包实现:

1.8.2、虚拟物品

虚拟物品也有两种:一种是静态的,一种是动态的。

1.8.2.1、静态的

比如下面的这些礼物:

静态的虚拟物品,每个礼物就是一个静态图片。

1.8.2.1.1、图片加载器

由于手机端内存非常有限,我们必须要控制好图片的加载,否则很容易出现OOM,通常需要设计缓存,一般都是比较复杂的, 幸好有很多开源的库可以直接使用。

Android中常用的图片加载器:

iOS中常用的图片加载器:

1.8.2.1.2、图片格式

曾几何时,为了网络传输速度,在Web前端中大多使用JPG静态图片。 因为JPG的压缩率非常的高,但缺点也是有的,就是不支持透明通道,而且他是有损压缩,对于要求不高的情况可以使用。 但是随着移动App的普及,对图片的要求也变高,刚开始大家都使用PNG格式的图片,PNG是支持透明通道,并且是无损压缩的,体积太大了,占用内存过高,所以一些公司探索开发新的图片编码技术。比如Google就开发出了WebP格式,并将它开源,而且也整合到了Android操作系统中了, 其他端的编解码都是开源的。目前,图片格式大多采用WebP

参考

1.8.2.1.3、图片压缩

如果图片格式不采用WebP,通常会使用一些图片压缩工具对图片进行压缩处理。

PC上常用的图片压缩工具:

Android上常用的图片压缩工具:

1.8.2.2、动态的

比如下面的这些礼物:

对于动态虚拟物品,可以是一些尺寸比较小的动态表情之类的,还有一些是尺寸非常大的,比如跑车、飞机、航母之类的。 还有一些可能是非常酷炫的特效,比如漂浮的点赞之类的。

对于动态的虚拟物品的本质,就是动画。这依赖于每个技术平台(Android、iOS、ReactNative、Web前端)的实现。

1.8.2.2.1、Flash

FlashAnimationToMobile这个库支持解码和展示Flash,支持AndroidiOS, 不过Flash基本上要全面退出历史舞台了,很少有公司再使用Flash了。

1.8.2.2.2、gif

无论是Android还是iOS原生操作系统都对gif支持的比较弱。

android-gif-drawable这个库支持Android上的解码和展示gif图片。

1.8.2.2.3、SVG

AndroidiOSWeb前端都是支持SVG的, 只是SVG是用XML描述的,效率上不太好。对于一些简单的动画可以使用它。

Android5.0中增加了VectorDrawableAnimatedVectorDrawable, 用以支持SVG

Android上支持SVG的库

iOS上支持SVG的库

SVGWeb前端中使用的比较广泛。

参考

1.8.2.2.4、帧动画

Android上的帧动画从一开始就支持,使用AnimationDrawable实现。

iOS上的帧动画从一开始就支持,使用UIImageView实现,注意:不是用CAKeyframeAnimation实现。

Web前端的动画实现方式有transitionanimation, 对于直播礼物来说,显然我们是使用animation来实现的, 因为animation使用的是关键帧(一帧一张图片)技术。

1.8.2.2.5、Canvas绘制

AndroidWeb前端中可以使用Canvas进行绘制,尤其是在Web前端中, 现在一些比较酷炫的动画是使用Canvas技术开发出来的,当然一般不直接使用Canvas,而是使用封装好的一些API

iOS上使用CALayer进行绘制。

使用Canvas绘制给客户端开发造成了很大的工作量,而且在AndroidiOS为了实现动态部署, 需要配合上热跟新技术,难度也是非常的大。

1.8.2.2.6、Lottie
1.8.2.2.7、其他动画库
1.8.2.2.8、自定义数据

将动画分解成多张图片,有一个配置文件保存这些图片播放时候的先后顺序、相邻两张图片的时间间隔、图片显示位置、是否可以循环播放等相关信息。 然后将这些资源打包成ZIP格式,客户端下载这些压缩包、解压、缓存、使用各自端的帧动画展示。

这种自由度大,但是缺点是对客户端要求有一定的难度,因为必须设计的合理,一开始要想到很多东西。