badyun 发表于 2020-7-12 07:22

【Javascript】视频本地一键切片上传至掘金,搭建自己的视频床

本帖最后由 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上,所以一点成本没有,国内访问速度还杠杆的,下面是实现截图

https://ae01.alicdn.com/kf/Hd74dda5a230a49a680c12b2761502d34H.jpg
https://ae01.alicdn.com/kf/H1a369702d70a47d0a6b2b496d2cc31daZ.jpg


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

在线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,等待进度跑完就可以在命令行看到生成的在线视频地址了

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

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


代码如下:


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
      let tsName = ele.split('/')
      // 执行上传
      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 = `https://badyun.gitee.io?url=${encodeURIComponent(m3u8Url)}`
    console.log('==============================')

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

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

城已空人未散 发表于 2020-7-12 09:28

这男的是谁,不认识不认识{:301_998:}

badyun 发表于 2020-7-16 02:51

本帖最后由 badyun 于 2020-7-16 02:54 编辑

浮华情未言 发表于 2020-7-14 17:58
https://github.com/crytion/videoUploader

老哥,你的代码确实能用,我给你改造了点东西,就是存下视频地 ...
可以的,我看了下你代码,可能构造在线播放地址那边复制错了,代码应该跟下面图里一样

还有就是我看到你把size改成了2,这样降低了切片数量和上传耗时。但是在切片大于5GB的大视频的时候,有概率(看视频码率)切出单体积大于10M的切片,造成一直上传失败,从而卡死,最终导致失败


https://ae01.alicdn.com/kf/H4cac884e3f2b4a01b1e4e19855dff0f5V.jpg

52PJ一只小团团 发表于 2020-7-12 07:38

支持支持,希望出带界面的

happyweeks365 发表于 2020-7-12 07:49

希望出带界面的

wujiLINGMAO 发表于 2020-7-12 07:49

楼主威武   学习了    谢谢

Ldfd 发表于 2020-7-12 08:16

这都能开车。。前排支持一波,现在掘金已经防盗链了,需要no referer 吧

garen 发表于 2020-7-12 08:40

楼主厉害啊

1763107897 发表于 2020-7-12 08:53

楼主厉害,这都开车....

jc021227 发表于 2020-7-12 08:59

感谢楼主的原创教程

wobzhidao 发表于 2020-7-12 08:59

这个软件确实不错的
页: [1] 2 3 4
查看完整版本: 【Javascript】视频本地一键切片上传至掘金,搭建自己的视频床