Skip to content
当前页

浏览器直播点播系列

  • 视频采集
  • 推流
  • 视频编码、协议、封装和传输
  • 视频解封装、解码
  • 浏览器视频播放

视频采集

navigator.mediaDevices.getUserMedia就可以调用笔记本摄像头,在把得到的数据给到video标签即可

推流

视频采集,比如安防行业一般用的rtmp协议推流,浏览器不支持直接接收(直接对接摄像头的推流有安全风险),需要用到中间服务器转换为fmp4、flv、hls等

中间服务器

  • ZLMediaKit
  • Simple Realtime Server
  • EasyDarwin
  • Monibuca

视频编码、协议、封装和传输

前面采集到的视频直接通过mediaRecorder,然后设置编码和封装格式就可以转为可下载的文件了,chrome一般只支持导出为webm,vp8/vp9编码。 可以自行用web版的ffmpeg转码。chrome如果内置h264编码器可能会有专利问题

常用编码格式

  • H264/avc: 最常用
  • H265/hevc 压缩率高
  • VP8/VP9,google开发的,应对h264/h265的收费
  • AV1: 最新的开源编码格式,比h265压缩率更高,但是cpu编解码也更慢

常用封装格式

  • mp4/fmp4: 兼容性最强也是最常用的,苹果和微软主导,编码格式一般是h264/h265; 音频acc。fmp4是MP4的一种进化变体,可以更好的分片,适合直播,后缀依然是.mp4
  • webm: google主导,专为web设计,一般是vp8/vp9/av1, 音频opus/vorbis
  • mkv: 几乎支持所有编码格式,支持封装多国语音和特效字幕,适合高清电影,体积大,且因为功能多,有些旧电视不支持
  • mov: 苹果的标准,视频编码为Apple ProRes/H264,体积偏大
  • flv: 直播常用,因为其延迟较低。早期只支持h264,后来非官方支持了h265

常用直播协议

  • rtmp(tcp): adobe开发,曾配合flash使用,推流端(主播端)的绝对标准,基于tcp协议,低延迟,浏览器并不支持
  • http(hls/dash): hls苹果开发的,dash是google主导的,把文件切成小片分别下载,hls的文件后缀一般是.m3u8。视频片段有.ts,.m4s
    • .ts:最早的切片格式,独立可播放,但是文件头部内容较多,占用空间大,单个ts文件可以直接播放
    • .m4s: apple 2016年推出的改进方案,此切片可以同时用于hls和dash,通常需要先加载一个init.mp4,没有init.mp4文件,单个m4s文件播不了
  • websocket/http-flv: 国内特色,利用http长连接或者websocket传输数据
  • webrtc(udp): 延迟极低,服务器端架构复杂,一般用于在线会议/在线教育
  • webtransport(http3): 最新api, 比 WebRTC 简单,比 WebSocket 快

视频解封装、解码

mp4/ws-fmp4:特殊的fmp4浏览器可以直接用video标签播放

flv/ws-flv: 浏览器不能直接播放flv, 需要先把flv解封装(demux),但是视频编码不动,然后重新封装为fmp4(remux),再把这个fmp4加载进MediaSourceExtension,喂给video标签。重新封装一般使用flv.js

hls/dash: hls地址后缀通常是.m3u8,苹果safari直接可以video播放,chrome一般先用hls.js进行demux,remux为fmp4,再喂给mediaSource,再喂给video

ts/ws-ts: 直接的.ts文件,可以配合B站的mpegts.js播放,延迟比flv还低一些

浏览器视频播放

  • video直接播放:fmp4
  • mse: mediaSourceExtension, 把文件转封装(remux)为fmp4,先喂给mediaSource,再给video
  • wcs: webcodecs, 先解封装(demux),获取h264/h265视频数据,然后用VideoDecoder调用硬件解码获取视频帧VideoFrame,再直接通过canvas画出来,canvas2d就是cpu画,canvas3d(webgl)就是主要gpu运算。另外wcs还需要手动处理音视频同步
    • 对比mse: mse就是视频片段,黑盒子。而wcs可以处理每一帧,常用于云游戏,视频编辑等
  • wasm: h264/h265解码由软件完成,比如ffmpeg(c语言编写,精简后编译为.wasm文件),然后由canvas2d/webgl播放
  • wasm-simd: 多线程软解

视频直播插件

直播技术协议列表

  • WebRTC 低延迟交互式直播
    • 常用插件:simple-peer
  • HLS/FLV http拉流
    • 常用插件:video.js 支持HLS/DASH
    • hls.js支持HLS
    • flv.js支持FLV
    • Clappr支持HLS/RTMP
  • MPEG-DASH 和hls类似

播放器

  • jessibuca.js: 和flv.js类似但封装的功能更多,flv.js偏底层,支持http-flv/ws-flv直播
  • h265webjs.js:支持h265的视频播放器
  • ZLMRTCClient.js:支持webrtc直播的插件
  • easyplayer.js

jessibuca作者文章分享

0到1理解web音视频从采集到传输到播放系列之《Jessibuca系列篇音视频封装传输》

开源版本只支持http-flv/ws-flv直播流

开源版本与收费版本差异

Last updated: