视频点播技术

 

目前 直播和点播 存在四种方案

  • rtmp(基于flash, 过时 延迟低)
  • http-flv(基于flv b站开源的flv.js)
  • hls(apple 私有协议 ios video 原生支持)
  • dash (行业 chrome原生支持 基于http)

rtmp适合原生客户端,延迟低.由于基于flash的原因.web端已经不能使用了. http-flv 主要是为了兼容之前的rtmp做的过渡 hls在国内很流行,主要是基于m3u8的ts分片 dash国外流行,支持多分辨率根据网速自动切换

技术选型:

  1. video.js
    • 支持多种编码方式
  2. nginx proxy_cache
    • nginx代理并直接磁盘缓存,减轻后端服务器的压力
  3. 开源云转码平台 express-ffmpeg
    • 支持选择分辨率
    • 支持水印
    • 支持ts加密
    • 提供docker镜像

安装并部署express-ffmpeg

docker 部署手册 https://www.moerats.com/archives/782/

详细文档 https://ffmpeg.moejj.com/instruction/#%E9%98%B2%E7%9B%97%E9%93%BE-token

docker run --restart=always --name express-ffmpeg -d \ 
-p 3000:3000 \ 
-e localip=192.168.10.75 \ 
-e usr=moerats \ 
-e pass=moerats \ 
-e url=moerats \ 
-v ~/express-ffmpeg/mongodb:/data \ 
-v ~/express-ffmpeg/config:/express-ffmpeg/config \ 
-v ~/express-ffmpeg/movies:/express-ffmpeg/movies \ 
-v ~/express-ffmpeg/videos:/express-ffmpeg/public/videos \ 
-v ~/express-ffmpeg/uploads:/express-ffmpeg/public/uploads \ 
-v ~/express-ffmpeg/images:/express-ffmpeg/public/images \ 
moerats/express-ffmpeg 

后台登录路径为 http://192.168.10.75:3000/moerats/ 管理员登录 admin/moerats

可以进行视频文件上传,转码,添加水印,复制m3u8链接等等. 开箱即用.

安装配置nginx

这里直接使用nginx proxy_cache 缓存m3u8的视频ts文件,节省后端服务器的压力.


http{
  # path 为缓存路径
  proxy_cache_path /usr/local/nginx/cache levels=1:2 keys_zone=cache:512m inactive=1d  max_size=60g;

  server {
	  
    listen 80;
    server_name aaa.com;
    location / {
      root html;
    }

    location /hls/ {
      # 这里cache 同http块内部的cache 名字保持一致
      proxy_cache cache;
      proxy_cache_valid 200 30d;
      types {
          application/vnd.apple.mpegusr m3u8;
          video/mp2t ts;
      }
      #add_header Access-Control-Allow-Origin *;
      #add_header Access-Control-Allow-Headers X-Requested-With;
      #add_header Access-Control-Allow-Methods GET,POST,OPTIONS;
      proxy_set_header        Host $host;
      proxy_set_header        X-Real-IP $remote_addr;
      proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;            

      # 如果直接挂载共享存储,则可以直接使用 alias 指定文件目录 
      #alias /videos/;
      proxy_pass http://192.168.10.75:3000/;
    }
  }
}