分发功能即线路管理设置

分发/线路原理详解

一般我们播放m3u8视频时候,实际上是通过访问m3u8文件索引的切片达到播放目的;而程序转码后的m3u8默认是从所在服务器读取切片文件,所以当越来越多的人请求时,带宽、负载和硬盘IO慢慢上限,最后导致播放会卡起来,大多数情况下主要因素还是带宽问题,不过这时候遇到这些问题就可以使用分发解决了。

分发/线路的原理就是程序会随时修改m3u8里面的ts地址,然后从其它服务器,或云存储如阿里云OSS、七牛云、亚马逊S3等读取切片,从而解决负载、带宽等问题。

分发/线路详细演示

提示:分发域名可以设置1到n个,具体看情况而定。

一般我们安装完程序,都是转码切片后,直接使用m3u8播放地址观看,这时候m3u8加载过程如下:

#比如我的m3u8链接地址如下:
http://efvcms.com/videos/201910/28/5db7045f57112a77e0aca6df/6agc5a/index.m3u8
#当用户读取m3u8后,这时候会依次从服务器读取切片文件,然后完成播放,链接大致如下:
http://efvcms.com/videos/201910/28/5db7045f57112a77e0aca6df/6agc5a/index0.ts
http://efvcms.com/videos/201910/28/5db7045f57112a77e0aca6df/6agc5a/index1.ts
http://efvcms.com/videos/201910/28/5db7045f57112a77e0aca6df/6agc5a/index2.ts
http://efvcms.com/videos/201910/28/5db7045f57112a77e0aca6df/6agc5a/index3.ts

从上面会发现,切片全部从本地服务器绑定的域名里读取。

接下来设置了2个分发域名,此时,m3u8加载和分发前就不一样了,加载过程如下:

#比如我的m3u8链接地址如下:
http://efvcms.com/videos/201910/28/5db7045f57112a77e0aca6df/6agc5a/index.m3u8
#当用户读取m3u8后,这时候会分别从你添加的分发域名读取全部的切片,然后完成播放,链接大致如下:
http://a.fenfa.com/videos/201910/28/5db7045f57112a77e0aca6df/6agc5a/index0.ts
http://b.fenfa.com/videos/201910/28/5db7045f57112a77e0aca6df/6agc5a/index1.ts
http://a.fenfa.com/videos/201910/28/5db7045f57112a77e0aca6df/6agc5a/index2.ts
http://b.fenfa.com/videos/201910/28/5db7045f57112a77e0aca6df/6agc5a/index3.ts

这里就可以看到,切片全部从分发域名里读取;且设置分发前后,只是加载切片链接的域名变化了,其它都不变。

分发/线路详细设置

提示:线路功能是默认对所有的视频同时生效,也就是全局功能,如果你只想分别让部分视频走指定线路,那么可以使用定向线路功能,后面会大概讲解下。

1、准备分发/线路域名

分发/线路域名只需要满足一个条件,就是用户通过该域名可以访问到视频切片,这里有2种方法,分别如下:

第一种,将切片目录videos(在源码目录public里)同步到其它服务器,或云存储如阿里云OSS、七牛云、亚马逊S3等,同步教程:点击查看;然后再给服务器或者云存储绑定一个域名,即分发域名;注意服务器绑定域名的时候,根目录需要设置到同步过来的videos文件夹所在的目录。

第二种,使用我们自研的CDN系统,即自己准备一个网络比较好的vps,自建cdn,该cdn会将源站的切片缓存到cdn服务器,再通过cdn域名,提供给用户观看,CDN系统:使用教程

这里如果你不用第三方云存储的话,就建议使用第二种,配置和使用极其方便。

2、设置分发/线路,也就是线路管理

先前往EFV后台左侧 ⇒ 转码设置 ⇒ 线路管理,创建一条新的线路,如图:

主要设置项如下:

#默认线路链接
你想几个线路域名提供切片读取,就填写几个线路域名,中间使用英文竖线|分开,最后面不能带/,如https://cdn1.efvcms.com|https://cdn2.efvcms.com

#移动线路链接<填入后,移动用户访问会走该线路,不填则使用默认线路>
输入移动线路链接,需要带http或者https,多线路用|分割,如https://cdn1.efvcms.com|https://cdn2.efvcms.com

#电信线路链接<填入后,电信用户访问会走该线路,不填则使用默认线路>
输入电信线路链接,需要带http或者https,多线路用|分割,如https://cdn1.efvcms.com|https://cdn2.efvcms.com

#联通线路链接<填入后,联通用户访问会走该线路,不填则使用默认线路>
输入联通线路链接,需要带http或者https,多线路用|分割,如https://cdn1.efvcms.com|https://cdn2.efvcms.com

#定时任务切换
该选项可以不用设置,如果设置了,则到了指定时间会自动切换到该线路;你可以设置多个定时线路,且默认只生效1个线路,即下一个定时线路开启时,就是上一个线路结束。

#线路参数
该选项可以不用填,特殊需求除外,即当播放指定线路时在切片后面会附带额外参数,用于各种验签或者验证来源等用途。

#是否默认线路
开启后,用户读取m3u8的时候,默认走该线路,且如果给多个线路同时设置此选项,则以最后一个为准。

#是否开启此线路
如果使用该线路,则必开

#未登录是否可以观看
该选项为权限最高级别,开启后,无视你设置的用户组,则任何人都可以直接播放使用。

注意,对于第三方程序引用,你不会对接相关权限的话,则未登录是否可以观看必开启。

<特别说明>定时线路说明及示范

定时任务示例:43 21 * * *21:43执行;15 05 * * *05:15执行;占位符5个, 即* * * * *,分别为分、时、日、月、周几,一般只需要改第12位的分和时即可,时钟为24小时制,其它根据实际情况修改。

注意,使用定时功能的,注意下服务器系统时间,可以在ssh客户端使用date命令查看,如果时间不对,可以运行命令改一下:

rm -rf /etc/localtime
ln -s /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

#查看修改后的时间
date

如果还是没改过来,则使用该命令继续试试:

date -s "$(curl -s --head https://www.baidu.com | grep ^Date: | sed 's/Date: //g') -000"

当定时线路生效后,该线路会一直有效,直到下一个定时线路生效后,才会失效,所以使用定时任务的,必须要设置一整天的线路。

比如我在晚上9点半的高峰期,自动切换到cdn线路,然后凌晨1点再切回到本地线路<本地线路即EFV高级版绑定域名>,则可以设置如下:

如果你在某个时间段设置的定时线路,则最好同时把这个时间段的定时线路默认打勾,这样这个时间段的线路会立即生效。

最后我这种设置效果,就是晚上9.30-凌晨1点都是用的cdn线路,凌晨1点到晚上9.30都用的本地线路。

相关定时任务时间设置参考:

43 21 * * *   #21:43 执行
15 05 * * *   #05:15 执行
0 17 * * *    #17:00 执行
0 17 * * 1    #每周一的17:00 执行
0,10 17 * * 0,2,3    #每周日,周二,周三的17:00和17:10 执行
0-10 17 1 * *    #毎月1日从17:00到7:10毎隔1分钟 执行
0 0 1,15 * 1    #毎月1日和15日和一日的0:00 执行
42 4 1 * *   #毎月1日的4:42分 执行
0 21 * * 1-6   #周一到周六21:00 执行
0,10,20,30,40,50 * * * *   #每隔10分 执行
*/10 * * * *   #每隔10分 执行
* 1 * * *   #从1:0到1:59每隔1分钟 执行
0 1 * * *   #1:00 执行
0 */1 * * *   #毎时0分每隔1小时 执行
0 * * * *   #毎时0分 执行
2 8-20/3 * * *   #8:02,11:02,14:02,17:02,20:02 执行
30 5 1,15 * *   #1日和15日的5:30 执行

定向分发/线路功能说明

提示:由于设置过于繁琐,最新版已隐藏该功能,如需使用,可联系我们单独恢复,且后续会重做该功能。

由于线路功能是默认对所有的视频同时生效,如果你只想分别让部分视频走指定线路,那么可以使用定向线路功能。

这里只会大概说下设置步骤,首先使用定向线路功能的话,需要开启一个线路管理功能才会生效,如未设置过,可以前往线路管理设置一个默认线路,且线路填入EFV高级版绑定域名,这样设置后的效果如下:

#为什么没有设置过线路的,需要设置一个线路且要填入EFV高级版绑定的域名?
一般你设置了一条默认线路后,所有的切片都会走这个线路域名,那么这个线路必须要能访问到切片才行,目前只有本地域名,即EFV高级版绑定的域名最合适,当然你也可以设置其它线路域名。

#设置了定向线路后,会和线路管理的默认线路冲突么?
对部分视频设置了定向线路后,那么这部分视频只会走这些定向线路的域名,脱离了线路管理的默认线路;未设置定向线路的依然走默认线路。

1、准备分发/线路域名

可参考上面的分发/线路详细设置步骤,这里推荐直接使用文档的CDN系统,同步切片会很麻烦。

2、设置定向线路

先前往EFV后台左侧 ⇒ 转码设置 ⇒ 视频管理,可以根据你的需求,筛选出你想设置定向线路的视频,批量/全选,点击下方定向线路即可。

注意设置的时候,你想几个线路域名提供切片读取,就填写几个线路域名,中间使用英文竖线|分开,最后面不能带/,如https://cdn1.efvcms.com|https://cdn2.efvcms.com

注意事项

如果给视频设置定向线路填错了域名、或者想修改,那么直接再次设置即可,会直接覆盖的旧的定向线路配置。

最后想关闭定向线路的话,可以关闭线路管理的默认线路;也可以清楚定向线路的数据,直接在ssh运行命令:

mongo
use ffmpeg
db.directfenfas.drop()

输出true的话,就清空好了,这时候定向线路配置已全部不生效。

api远程调用

提示:使用api调用必须要设置一个默认线路,不然不生效。

获取线路列表

GET /api2/lines

#返回数据
[
    {
        "group": null,
        "vipGroup": null,
        "createAt": "2021-06-28T03:55:16.236Z",
        "_id": "60da81313b870875ec5d9fa4",
        "title": "组合线路",
        "url": "https://cdn1.efvcms.com|https://cdn2.efvcms.com",
        "open": "on",
        "default": "on",
        "notlogin": "on",
        "__v": 0
   },
    {
        "group": null,
        "vipGroup": null,
       "createAt": "2021-06-28T03:55:16.236Z",
       "_id": "60da817b3b870875ec5da0b5",
        "title": "cn2线路",
        "url": "https://cdn3.efvcms.com",
        "open": "on",
        "default": null,
        "notlogin": "on",
        "__v": 0
    }
]

m3u8调用指定线路

https://域名/index.m3u8?line=线路id

m3u8调用示例

#直接访问,则自动调用默认线路
/videos/60d88e0d66c8886d0a961818/720/index.m3u8

#使用上述线路列表示例的cn2线路
/videos/60d88e0d66c8886d0a961818/720/index.m3u8?line=60da817b3b870875ec5da0b5