云存储同步详细设置

支持S3、七牛云、Backblaze B2、腾讯云OSS、阿里云OSS、其它服务器、谷歌云、Bunny、CF R2、华为云、Wasabi、Blob。

一般我们转码后,有的对播放速度不满意,除了使用CDN加速外,还可以将切片上传到其它服务器、阿里云OSS、七牛云或者其他云存储进行加速。

目前已支持以下存储:

亚马逊S3,也适用于接口支持AWS S3的存储服务
Minio存储,适用于同步到其它服务器
Cloudflare R2
华为云
七牛云
阿里云OSS
腾讯云OSS
又拍云
Wasabi
Bunny
Google Cloud Storage
Azure Blob Storage
Backblaze B2

同步原理

提示:最新版已新增剧集封面同步,如当前使用版本无同步剧集封面功能,则推荐更新到最新版后使用。

同步期间会自动扫描所有已转码完成的视频切片文件夹和已发布的剧集封面文件夹,并根据你的同步设置,对文件夹里的截图、切片等文件进行上传和删除处理。

当某个视频的所有指定文件均上传成功,则会记录该视频,下次自动扫描的时候,会跳过该视频,也就不会再次上传,如果你更换了云存储,想重新上传该视频,可清空该视频的同步记录,从而会重新扫描并上传该视频,清空教程可看下面。

当某个视频有一个文件因网络问题上传失败,则该文件会有3次重试次数,如果3次依旧失败,那么该文件在本轮扫描不会再次上传,并且该文件所属的视频也不会被记录,也就是在下轮自动扫描中,会重新再次被扫描上传,可尽量防止因网络问题造成同步缺切片导致出现播放问题。

操作步骤

先前往EFV后台左侧 ⇒ 转码相关 ⇒ 云储存设置,添加对应的云存储,然后开启同步。

同步参数

云存储需要的同步参数在每个类型添加页面都有说明,这里说一下比较难找的几个。

S3endpoints参考 ⇒ 点击查看

Wasabiendpoints参考 ⇒ 点击查看,基本上组成就是s3.region.wasabisys.com

CF R2endpoints参考 ⇒ 点击查看,基本上组成就是https://ACCOUNT_ID.r2.cloudflarestorage.com

Backblaze B2region查看方法,如果桶的endpoints3.us-west-002.backblazeb2.comregion可以填us-west-002,也就是中间的那段字符串。

Minio存储需要在接收同步的服务器上安装Minio,安装教程 ⇒ 点击查看;还需要让转码服务器Minio服务器的时间一致,不然同步会失败,可使用date命令进行时间查看。

如果两台服务器时间不一样,可以分别在ssh客户端运行命令改一下:

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

#查看修改后的时间
date

如何查看视频是否已同步

前往视频管理,先去标题栏把是否已同步调出来,方便标题栏查看。

然后点击其它筛选,选择已同步或未同步的视频即可。

如果你想查看剧集的封面是否已同步,可前往剧集状态筛选进行相关选择即可。

如何批量设置同步指定视频

提示:程序默认同步所有已转码完成的视频数据和已添加的剧集封面数据,如使用指定同步功能,则在配置云存储同步的时候,开启指定同步功能。

前往视频管理 ⇒ 然后批量选择你要同步的视频,点击下方批量设置同步即可

然后可以点击其它筛选,选择未设置指定同步,筛选出未设置的,方便快速进行设置其它视频。

指定剧集就需要前往剧集管理设置,方法都一样,最后如果你想清空设置的信息,可前往云存储设置页面,点击清空按钮,进行清空。

如何一键清空所有视频和剧集同步记录

可直接在云存储设置页面,点击清空按钮,进行清空,清空后,已同步的所有记录均会清空,这时候可重新同步所有数据。

同步日志查看

使用SSH客户端,比如Xshell软件,登录服务器,再使用命令:

pm2 log efvasync

修改监控间隔时间

目前默认间隔3分钟,先编辑helper/newcloud.js文件,需要修改代码await agenda.every("3 minutes", "auto async"),修改如下:

#分钟单位minute,且大于1分钟用minutes
1 minute
2 minutes
3 minutes

#秒钟单位,比如20秒
20 seconds

#如果我要修改为30秒,则具体代码
await agenda.every("30 seconds", "auto async");

根据自行情况进行相关修改,不建议改太低,否则会占用资源;修改完重新开启同步即可。

如何加快同步速度

提示:机器性能一般的默认即可,不然上传太猛服务器容易崩掉,或者被云存储服务商限制,导致上传出错,不是太赶速度就微调下即可。

目前同步原理就是,按时监听未同步的视频,然后每次只处理2个未同步视频,处理该未同步视频的时候,每次同时上传5个切片,依次传完。

如果你的视频量大,且都是长视频,并且同步远远赶不上秒切速度,则可以修改如下配置进行同步加速,编辑helper/newcloud.js文件,修改如下:

#同时处理未同步的视频数,默认2
asyncMapLimit(unAsyncFiles, 2, async (file)

#处理每个未同步的视频的时候,每次上传的切片数,默认5
await asyncMapLimit(files, 5, async (file)

最后修改完毕后,重新点击开启同步就行了。

同步完成获取转码信息

先去EFV后台转码设置开启域名通知同步完成通知,再设置一个对接域名,如果你想设置多个通知域名,中间请使用英文|分开。

当每一个视频同步完成后,EFV会将视频的详细信息JSON类型POST到这个域名,您在您的后台只需要针对这个接收API处理JSON数据入库您自己的第三方程序数据库即可。

相关信息:

对象名:movie

#获取到的相关参数信息
status: String,
size: String,
category: String,
originalname: String,
originaltitle: String,
aka: String,
language: String,
banben: String,
vtt: String,
thumbnails: String,
poster: String,
poster2: { url: String, width: Number, height: Number },
count: { type: Number, default: 0 },
retry: { type: Boolean, default: false},
path: String,
duration: String,
director: [String],
writer: [String],
rate: Number,
year: Number,
stars: [String],
summary: String,
country: [String],
tags: [String],
m3u8paths: [{ hd: Number, path: String }],
previewvideo: String,
price: Number,
totv: Schema.Types.ObjectId,
md5: String,
createAt: {
  type: Date
}

如果你使用了详细编辑,里面的数据都有,接收API就选择里边的数据处理就行了。

单个视频接收的JSON数据

{
poster2: {
  url: '/videos/202202/07/61ffbfbb9b36dd00c878b4a1/poster.jpg',
  height: 773,
  width: 540
},
count: 23,
retry: false,
autoPublish: false,
director: [ '古桥一浩' ],
writer: [ '古桥一浩' ],
stars: [
  '三宅健太',  '宫野真守', '樱井孝宏',
  '伊藤静',   '梶裕贵',  '绵贯龙之介',
  '濑户麻沙美', '早见沙织', '滨野大辉',
  '柳田淳一',  '铃木玲子', '石冢运升',
  '中井和哉',  '天崎滉平', '菅原慎介',
  '町山芹菜'
],
country: [ '日本' ],
tags: [ '剧情', '喜剧', '战争', '动画' ],
screenshots: [
  '/videos/202202/07/61ffbfbb9b36dd00c878b4a1/0.jpg',
  '/videos/202202/07/61ffbfbb9b36dd00c878b4a1/2.jpg',
  '/videos/202202/07/61ffbfbb9b36dd00c878b4a1/1.jpg',
  '/videos/202202/07/61ffbfbb9b36dd00c878b4a1/3.jpg'
],
_id: '61ffbfbb9b36dd00c878b4a1',
originalname: '窈窕淑女前篇:红绪,花样的17岁',
status: 'finished',
path: './movies/Haikara-san ga Toru the movie.mkv',
category: '日本动漫',
size: '5497612960',
createAt: '2022-02-16T09:25:49.733Z',
m3u8paths: [
  {
    _id: '6200c8949dc15a00c15be7db',
    hd: 640,
    path: './public/videos/202202/07/61ffbfbb9b36dd00c878b4a1/8f89fb/index.m3u8'
  },
  {
    _id: '6200cc499dc15a00c15be809',
    hd: 1280,
    path: './public/videos/202202/07/61ffbfbb9b36dd00c878b4a1/08cad8/index.m3u8'
  }
],
thirdm3u8: [],
__v: 1,
height: 1080,
width: 1920,
duration: '97分钟',
moviepath: '/videos/202202/07/61ffbfbb9b36dd00c878b4a1',
gif: '/videos/202202/07/61ffbfbb9b36dd00c878b4a1/1.gif',
previewvideo: '/videos/202202/07/61ffbfbb9b36dd00c878b4a1/preview.mp4',
poster: '/videos/202202/07/61ffbfbb9b36dd00c878b4a1/cover.jpg',
firstScreen: '/videos/202202/07/61ffbfbb9b36dd00c878b4a1/first.jpg',
aka: '',
banben: 'HD',
language: '日语',
originaltitle: '劇場版 はいからさんが通る 前編 ~紅緒、花の17歳~',
rate: 7.5,
summary: '根据70年代大受欢迎的少女漫画《窈窕淑女》改编的剧场版动画,《窈窕淑女》的题目字面意思出自诗经:“窈窕淑女,君子好逑"。大和和纪的《窈窕淑女》是1977年的少女漫画优秀杰作,曾经红极一时。讲述了一个关...',
year: 2017
}

注意m3u8paths里边的hd参数,320240P480360P640480P1138640P1280720P19201080P25602K20000为原画。

剧集接收的JSON数据

提示:这里仅仅只是剧集里面封面同步完成后的通知,不包括单集同步。

{
poster2: {
    url: '/poster/623eaaf9b1d50c9badb2f47b-poster2.jpg',
    height: 763,
    width: 540
},
count: 263,
director: [ '中山敦史', '山本裕介', '名和宗则', '森义博', '重原克也' ],
writer: [ '木村畅', '横手美智子' ],
stars: [
    '兴津和幸',   '小野大辅',   '伊藤静',
    '大原沙耶香', '麦人',       '田中敦子',
    '土师孝也',   '中村悠一',   '高桥李依',
    '稻田彻',     '绵贯龙之介', '野濑育二',
    '松冈祯丞',   '千本木彩花', '加隈亚衣',
    '田村由香里', '柳田淳一',   '相马康一',
    '手冢弘道',   '井上喜久子', '菅生隆之',
    '大桥彩香',   '朝井彩加',   '阪口大助',
    '樱井浩美',   '天崎滉平',   '菅原慎介',
    '木下浩之',   '千叶进步',   '松本忍',
    '松风雅也',   '岩泽俊树',   '内匠靖明',
    '木内太郎',   '伊丸冈笃',   '池田胜',
    '潘惠子',     '深川和征'
],
country: [ '日本' ],
tags: [ '动画', '奇幻' ],
published: 'waiting',
_id: '623eaaf9b1d50c9badb2f47b',
title: '骑士&魔法',
originaltitle: 'ナイツ&マジック',
aka: "Knight's Magic",
year: 2017,
duration: '24分钟',
episodescount: '13',
language: '日语',
rate: 6.6,
summary: '能干的程序员,同时是重度机器人宅的青年,转生到了巨大机器人“幻晶骑士(Silhouette Knight)”震动大地的骑士与魔法的异世界!?以艾尔涅斯帝·埃切贝里亚的身份转生的他,活用丰富的机械知识...',
status: 'wanjie',
zhouqi: '',
episodes: [
    {
    _id: '62777218e7a65ed82225e5bc',
    episode: '01',
    movieid: '62010cfa471273018072295a'
    },
    {
    _id: '62777218e7a65ed82225e5bd',
    episode: '02',
    movieid: '62010cfa471273018072295b'
    },
    {
    _id: '62777218e7a65ed82225e5be',
    episode: '03',
    movieid: '62010cfa471273018072295c'
    },
    {
    _id: '62777218e7a65ed82225e5bf',
    episode: '04',
    movieid: '62010cfa471273018072295d'
    },
    {
    _id: '62777218e7a65ed82225e5c0',
    episode: '05',
    movieid: '62010cfa471273018072295f'
    },
    {
    _id: '62777218e7a65ed82225e5c1',
    episode: '06',
    movieid: '62010cfa4712730180722960'
    },
    {
    _id: '62777218e7a65ed82225e5c2',
    episode: '07',
    movieid: '62010cfa4712730180722961'
    },
    {
    _id: '62777218e7a65ed82225e5c3',
    episode: '08',
    movieid: '62010cfa4712730180722963'
    },
    {
    _id: '62777218e7a65ed82225e5c4',
    episode: '09',
    movieid: '62010cfa4712730180722964'
    },
    {
    _id: '62777218e7a65ed82225e5c5',
    episode: '10',
    movieid: '62010cfa4712730180722959'
    },
    {
    _id: '62777218e7a65ed82225e5c6',
    episode: '11',
    movieid: '62010cfa4712730180722965'
    },
    {
    _id: '62777218e7a65ed82225e5c7',
    episode: '12',
    movieid: '62010cfa471273018072295e'
    },
    {
    _id: '62777218e7a65ed82225e5c8',
    episode: '13',
    movieid: '62010cfa4712730180722962'
    }
],
createAt: '2022-05-08T07:32:40.856Z',
__v: 0,
poster: '/poster/623eaaf9b1d50c9badb2f47b-poster.jpg',
category: '日本动漫',
updateAt: '2023-01-16T16:01:40.804Z'
}

movieid为集数的视频id,可以通过拼接获取该集数的自适应m3u8地址,拼接如下:

#拼接格式:/movie/auto/ + 视频id + .m3u8
/movie/auto/62010cfa4712730180722962.m3u8

最后就可以获取每个集数的自适应m3u8链接了。