本帖最后由 badyun 于 2020-7-13 10:16 编辑
免责:本脚本仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请自行负责
今年二月份的时候我发了下面这个帖子
利用掘金搭建自己的视频床
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}`)
})()
|