免责:本脚本仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请自行负责
今年二月份的时候我发了下面这个帖子

利用掘金搭建自己的视频床
https://www.52pojie.cn/forum.php?mod=viewthread&tid=1110792&highlight=%CA%D3%C6%B5%B4%B2

当时只是零散的记录了想法实现的过程,就没有再深入关注

然后昨晚上太渴了,喝了4瓶红牛,睡不着了,闲的蛋疼,写了个一键脚本

只需要你在脚本里定义好要切片上传的视频路径和临时文件存储路径,运行后就能得到一个m3u8的在线地址,和一个m3u8的播放器地址

所有的资源都同步在掘金的cdn上,所以一点成本没有,国内访问速度还杠杆的,下面是实现截图


我拿我电脑上珍贵的麻豆测试下,还是很不错的

在线m3u8文件地址:https://user-gold-cdn.xitu.io/2020/7/12/17340116a0566a56

播放器地址我暂时删了,毕竟车速太快了哈哈

食用方法如下:

第一:电脑安装ffmpeg
安装方法:https://www.cnblogs.com/wuxun1997/p/12447190.html

第二:电脑安装node环境,因为我脚本是用nodejs写的
安装方法:https://jingyan.baidu.com/article/7082dc1c8a6bcca40b89bd0d.html

最后新建个目录,在里面新建个app.js,把我下面的代码扔进去(修改视频文件地址为你自己的视频文件地址,修改缓存文件夹地址为你自己的文件夹地址)

然后在当前目录下命令行执行npm i下载依赖

依赖下载好后执行node app,等待进度跑完就可以在命令行看到生成的在线视频地址了

其他的话,我注释写的很清楚了,有问题再问

要是一会儿还睡不着的话,再考虑考虑写出带界面的软件,暂时将就下吧

代码如下:

[JavaScript] 纯文本查看 复制代码const exec = require(\’child_process\’).exec;
const superagent = require(\’superagent\’);
const { sleep } = require(\’sleep\’);
const fs = require(\’fs\’);
const glob = require("glob");

const videoDir = \’./MD-0030.mp4\’;//视频路径
const tsDir = \’./tmp/\’;//切片及m3u8文件存储路径
const size = 1;//视频切片大小,数字越大单个切片时常越长体积越大,掘金图传限制最大图片大小为10M
const content = `ffmpeg -i ${videoDir} -c copy -map 0 -f segment -segment_list ${tsDir}index.m3u8 -segment_time ${size} ${tsDir}%03d.ts`;//切片命令

// 调用shell脚本方法
async function shell(content) {
return new Promise((resolve, reject) => {
exec(content, (error, stdout, stderr) => {
if (error) {
reject(error);
}
else {
resolve(stdout)
}
});
})
}

// 上传到掘金方法(频繁重传)
async function upload(path) {
try {
let s = await superagent.post(\’https://cdn-ms.juejin.im/v1/upload\’)
.query({
bucket: "gold-user-assets"
})
.attach(\’file\’, path, \’1.png\’)
let url = s.body.d.url.https
console.log(url)
return url
} catch (error) {
// 出错表示掘金上传频繁拒绝了,暂停3秒继续请求
sleep(3)
console.log(error)
return upload(path)
}
}

(async () => {
// 进行视频切片
console.log(\’开始视频切片\’)
await shell(content);
console.log(\’视频切片完成\’)

// 获取到切片列表
let tsList = glob.sync(`${tsDir}*.ts`);

// 获取到m3u8实体内容
let m3u8Content = fs.readFileSync(`${tsDir}index.m3u8`).toString();
// console.log(m3u8Content)

console.log(\’开始上传切片\’)
// 上传切片
for (let index in tsList) {
let ele = tsList[index]
let tsName = ele.split(\’/\’)[ele.split(\’/\’).length – 1]
// 执行上传
let url = await upload(ele)

// 获取到上传地址后替换原版的地址
m3u8Content = m3u8Content.replace(tsName, url)

// 删除已上传的ts
fs.unlinkSync(ele)
console.log(`上传成功,当前上传进度:${parseInt(index) + 1}/${tsList.length}`)
console.log(\’==============================\’)

}
console.log(\’切片上传完成\’)

// 获取到所有地址后,将新地址写出并同步上传到掘金
fs.writeFileSync(`${tsDir}main.m3u8`, m3u8Content);
let m3u8Url = await upload(`${tsDir}main.m3u8`)
console.log(\’m3u8文件上传成功\’)

// 构造在线播放地址
let playUrl = `[url=https://badyun.gitee.io?url=]https://badyun.gitee.io?url=[/url]${encodeURIComponent(m3u8Url)}`
console.log(\’==============================\’)

// 清空文件缓存
fs.unlinkSync(`${tsDir}index.m3u8`)
fs.unlinkSync(`${tsDir}main.m3u8`)

console.log(`m3u8在线链接:${m3u8Url}`)
console.log(`视频在线播放器地址:${playUrl}`)
})()

本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。

最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。 若排除这种情况,可在对应资源底部留言,或联络我们。

对于会员专享、整站源码、程序插件、网站模板、网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。

如果您已经成功付款但是网站没有弹出成功提示,请联系站长提供付款信息为您处理

源码素材属于虚拟商品,具有可复制性,可传播性,一旦授予,不接受任何形式的退款、换货要求。请您在购买获取之前确认好 是您所需要的资源