前言

因为工作需要, 我开始接触流媒体

准备工作

其实一开始, 我对直播这块是不了解的;

首先, 说说流媒体是怎么运作的吧

流媒体其实像一个管道, 举例斗鱼的直播场景:

主播开启摄像头, 摄像头采集数据, 并将这些数据实时发送到斗鱼服务器 (推流)

然后, 大量观众们打开网址, 浏览器中的播放器与斗鱼服务器也进行实时的通信, 播放器读取数据展示在浏览器中 (拉流)

流程是如此, 但是实现的协议有好几种:

  • rtmp (延迟低, 兼容性不太好)
  • rtmp+websocket (rtmp的http实现方案, 个人认为有些复杂, 不适合我现在的场景)
  • hls (延迟较高, 苹果提出的基于 HTTP 的流媒体传输协议, 视频封装格式为ts, 但我观察b站对游戏竞赛场景(dota表演赛, 高并发场景)下使用的也是hls的方式, 待观察)
  • http-flv ((延迟低, 支持http,https播放)
  • webrtc (基于RTP/RTCP, 实时性好兼容性好, 能做到全平台兼容, 但似乎说如今还不完善, 待继续深入了解)
  • srs (流媒体服务器, 其定位是运营级的互联网直播服务器集群, 我打算将其部署到Linux平台中)

总而言之, 结合场景来选择方案吧

开发环境下, 我选择的是 OBS 进行推流 和 VLC 进行播放

不同的播放器拉流效果也是不一样的, VLC播放器好用但是延迟还是稍高些

我选择的方案是 http-flv + flv.js, 这样一来, 便可以无需Flash插件, 在浏览器进行 Html5 播放了

现如今了解的还只是皮毛,所以文章太过琐碎, 存在不少问题, 本文会持续更新的

  • 网络
    • TCP
    • UDP
  • 客户端
    • 缓冲
    • 累积延迟与跳帧(seek)处理
    • wasm
  • 服务端
    • GOP
    • ffmpeg推流优化
    • 多进程