当前位置 博文首页 > eguid:【从零开始搭建直播平台】-序章(从flash时代的rtmp到过

    eguid:【从零开始搭建直播平台】-序章(从flash时代的rtmp到过

    作者:[db:作者] 时间:2021-09-05 09:52

    为什么会有这个系列专栏?

    在2020年12月flash正式落幕之后,流媒体领域是否有新的技术替代?有没有较为成熟的整体方案?市面上的直播/流媒体平台都在使用哪些方案?有没有通用又简单快速的搭建方案?不同的方案在行业内部也是争论不休,最终,这是个百花齐放的时代,让我们来一起探讨这些前沿问题。

    本篇文章不仅可作为想要进入流媒体行业的“萌新”入门,也可为资深流媒体开发者提供技术参考和商业技术选型。

    方案选型

    flv

    目前来讲还没有任何一个通用成熟的技术方案能够替代flash时代的rtmp。

    虽然目前主流的ws-flvhttp-flv方案确实可以勉强胜任。但是这个方案有致命缺点,不支持最新的hevc(h265),更别提以后的vvc(h266),因此flv方案目前来讲没有未来,但是可以作为首选过渡方案,主要原因是它简单,且与原来的flash那套rtmp方案完全兼容。

    webrtc

    2020年以来很多大厂(阿里,鹅厂,度娘等大厂)已经开始逐步实践基于webrtc搭建自研私有流媒体体系。但是webrtc方案除非有很大改进,不然现在光是只支持google自己的avx编码基本上就劝退99%的厂商了。这种方案与原有流媒体方案完全无法兼容,现有流媒体想要兼容webrtc都需要额外增加转码成本,将h264/h265转码为avx编码。

    补充:
    有很多人想知道WebAssembly在流媒体有没有什么应用场景?
    博主的回答是:不多,有一丁点

    由于的WebAssembly 不支持****tcp/udp网络通信这个是WebAssembly技术的最大局限,如果后面能开放网络通信,那将会大放光彩,甚至颠覆现有网页格局),所以只能用在视频解码,音视频编辑,游戏开发之类的高强度计算类型下,然后还需要借助webgl或webgpu来渲染,目前对于流媒体领域来说没太大用,对于网页视频编辑可能用处较大,它没有解决流媒体领域根本痛点:网络传输。
    WebAssembly技术可以参见博主另一篇文章关于此类技术的介绍和ffmpeg视频编辑领域的应用:一篇文章全面了解WebAssembly

    提示:本专栏可作为个人开发者和中小公司搭建直播平台的技术方案参考,专栏所实现代码功能可自由修改分发,无版权风险。

    关于没有选择webrtc方案的原因解释

    现在webrtc基本就是三个方案:mesh(p2p),sfu(服务端合流),mcu(分发,这个是符合直播流媒体方案,服务器只做转发)。

    1. 开发成本高
      开发成本上webrtc需要开发客户端和前端播放器渲染,而flv/hls基本上都有现成的成熟方案可用,只需要很短时间就可以让直播平台快速成型。

    2. 服务器成本高
      不仅包含开发成本也有服务器成本
      大家知道webrtc(avx/g711)和主流rtmp/flv方案的编码不兼容(h264/aac),如果要兼容后者,就要在服务端进行转码。

    3. 不通用(没有成熟方案)
      现有使用webrtc的厂商基本都是建立私有协议(可以参考阿里淘宝等电商直播)。

    本专栏采用flv直播方案

    我们这次选择使用最简单成本最低的flv方案来快速搭建直播平台。

    为什么选择flv

    1. 兼容性
      flv本身就属于rtmp协议栈,无缝兼容flash时代的rtmp流媒体。
      flv支持websocket和http协议传输,与浏览器兼容性较好。
    2. 可靠
      flv可以通过websocket和http传输,可靠性高,无丢包风险。
    3. 成熟
      从2015年至今,flv方案一直是直播平台h5网页上的主流方案,久经考验。
      从流媒体服务到前端播放器都有成熟的开源库可选。
    4. 简单
      开发起来简单,使用nginx/srs/zlmediakit作为流媒体服务,前端使用支持mse的flv播放组件即可快速成型。
    5. 低成本
      不需要转码,对服务器性能要求低,占用计算资源成本低。

    架构

    • 流媒体服务
      流媒体服务可以使用nginx-flv、srs或zlmediakit等流媒体服务。
      这几个流媒体服务博主会在后续的文章种详细实战搭建这三个流媒体服务。

    • 推流端
      推流可以使用obs,也可以使用ffmpeg或者自己开发的javacv推流器。
      再初期,我们会通过obs或者ffmpeg作为推流工具,后面我们会通过javafx和javacv实现自己的推流客户端。

    javacv技术可以参考博主系列专栏:
    javacv教程文档汇总篇

    • 拉流播放端
      本次我们会开发一个直播网站,用户可以注册、登录、查看直播列表和观看他人直播。
    1. 浏览器端拉流
      无flash插件ws-flv,http-flv,fmp4,dash,hls等(其中http-flv在浏览器端面临最多六路播放的限制)。
    2. 移动端拉流
      安卓/ios原生可以拉流rtsp/rtmp/flv/hls等任意协议。
      h5可以使用flv和hls播放
      微信小程序支持rtmp/flv/hls任意门协议

    弹幕和礼物这类非流媒体功能,看后续专栏反馈,如果需要可能会增加这部分方案介绍和实现。

    到这里为止,对于刚入门的“萌新”而言,本文涉及的概念较多,建议多读几遍,关键字解释网上都有,多搜多看。如还有问题,可以多多在评论区“评论”。

    对于行业内资深开发者,欢迎一起参与交流讨论,如有问题,请多多批评指正。

    持续更新中,未完待续…

    cs