• 虎牙直播弹幕转换字幕格式 基于Node.js 的 huya-danmu


    1 首先安装nodejs运行环境, 从 http://nodejs.cn/download/ 下载对应的版本

    2 安装 huya-danmu 模块, https://github.com/BacooTang/huya-danmu 有详细的安装方法

    3 参照 huya-danmu 模块中 test.js 编写 huya.js 新文件

      1 const huya_danmu = require('./index')
      2 var fs = require('fs')
      3 
      4 const roomid = process.argv[2]
      5 const client = new huya_danmu(roomid)
      6 var t1 = new Date().getTime()
      7 var t2 = t1
      8 var interval = 0
      9 var logName = ''
     10 t1 = process.uptime()*1000
     11 
     12 var emots = {
     13 "/{dx" : "[大笑]",
     14 "/{sh" : "[送花]",
     15 "/{tx" : "[偷笑]",
     16 "/{dk" : "[大哭]",
     17 "/{hh" : "[嘿哈]",
     18 "/{66" : "[666]",
     19 "/{gd" : "[感动]",
     20 "/{yw" : "[疑问]",
     21 "/{xh" : "[喜欢]",
     22 "/{jx" : "[奸笑]",
     23 "/{zan" : "[赞]",
     24 "/{ka" : "[可爱]",
     25 "/{am" : "[傲慢]",
     26 "/{kx" : "[开心]",
     27 "/{88" : "[拜拜]",
     28 "/{hx"  : "[害羞]",
     29 "/{zs"  : "[衰]",
     30 "/{pu"  : "[吐血]",
     31 "/{zc"  : "[嘴馋]",
     32 "/{sq"  : "[生气]",
     33 "/{fe"  : "[扶额]",
     34 "/{bz"  : "[闭嘴]",
     35 "/{kw"  : "[枯萎]",
     36 "/{xu"  : "[嘘]",
     37 "/{xk"  : "[笑哭]",
     38 "/{lh"  : "[流汗]",
     39 "/{bk"  : "[不看]",
     40 "/{hq"  : "[哈欠]",
     41 "/{tp"  : "[调皮]",
     42 "/{gl"  : "[鬼脸]",
     43 "/{cl"  : "[戳脸]",
     44 "/{dg"  : "[大哥]",
     45 "/{kun" : "[困]",
     46 "/{yb"  : "[拥抱]",
     47 "/{zt"  : "[猪头]",
     48 "/{kl"  : "[骷髅]",
     49 "/{cc"  : "[臭臭]",
     50 "/{xd"  : "[心动]",
     51 "/{dao" : "[刀]"
     52 }
     53 
     54 function checkemot(str)
     55 {
     56     if(str.includes('/{') == false ) return str
     57     for(var key in emots) {
     58         str = str.replace(new RegExp(key,'g'), emots[key])
     59     }
     60     return str
     61 }
     62 
     63 function PFI(num)
     64 {
     65     if(num<10)
     66         return '0'+num
     67     else 
     68         return num
     69 }
     70 
     71 function PFI3(num)
     72 {
     73     if(num<10) return '00'+num
     74     if(num<100) return '0'+num
     75     return num
     76 }
     77 
     78 function getNowFormatDate() 
     79 {
     80     var date = new Date();
     81     var seperator1 = "";
     82     var seperator2 = "";
     83     var month = date.getMonth() + 1;
     84     var strDate = date.getDate();
     85     if (month >= 1 && month <= 9) 
     86     {
     87         month = "0" + month;
     88     }
     89     if (strDate >= 0 && strDate <= 9) 
     90     {
     91         strDate = "0" + strDate;
     92     }
     93     
     94     var strHH = date.getHours()
     95     var strMM = date.getMinutes()
     96     var strSS = date.getSeconds()
     97     if (strHH >= 0 && strHH <= 9) strHH = "0" + strHH;
     98     if (strMM >= 0 && strMM <= 9) strMM = "0" + strMM;
     99     if (strSS >= 0 && strSS <= 9) strSS = "0" + strSS;
    100         
    101     var currentdate = date.getFullYear() + seperator1 + month + seperator1 + strDate
    102             + "-" + strHH + seperator2 + strMM + seperator2 + strSS;
    103     return currentdate;
    104 }
    105 
    106 function init()
    107 {
    108     var savepath = process.argv[3]
    109     var savefn = process.argv[4]
    110     if(typeof(savefn)=='undefined')
    111         savefn = ""
    112     else
    113         savefn = "_" + savefn.replace(/ /g,"_")
    114     if(typeof(savepath)=='undefined')
    115         logName = './'+getNowFormatDate()+'_'+roomid+savefn+'.LRC'
    116     else
    117         logName = savepath+'/'+getNowFormatDate()+'_'+roomid+savefn+'.LRC'   
    118     console.log(logName)
    119     fs.appendFile(logName,'[ti:'+getNowFormatDate()+ ']
    ', function (err) {});
    120     fs.appendFile(logName,'[ar:'+savefn+']
    ', function (err) {});
    121     fs.appendFile(logName,'[offset:0]
    ', function (err) {});
    122 }
    123 
    124 init()
    125 
    126 client.on('connect', () => {
    127     console.log(`已连接huya ${roomid}`)
    128 })
    129 
    130 client.on('message', msg => {
    131     switch (msg.type) {
    132         case 'chat':
    133             //console.log(`[${msg.from.name}]:${msg.content}`)
    134             t2 = process.uptime()*1000
    135             interval = (t2 - t1)
    136             var date = new Date( interval )
    137             var HH = date.getUTCHours()
    138             var MM = PFI(date.getUTCMinutes()+HH*60)
    139             var SS = PFI(date.getUTCSeconds())
    140             var MS = PFI3(parseInt(date.getUTCMilliseconds()))
    141             var msg = `[${MM}:${SS}.${MS}] ${msg.content}`
    142             msg = checkemot(msg)
    143             console.log(msg)
    144             fs.appendFile(logName, msg+'
    ', function (err) {})
    145             break
    146          // case 'gift':
    147             // console.log(`[${msg.from.name}]->赠送${msg.count}个${msg.name}`)
    148             // break
    149          // case 'online':
    150             // console.log(`[当前人气]:${msg.count}`)
    151             // break
    152     }
    153 })
    154 
    155 client.on('error', e => {
    156     console.log(e)
    157 })
    158 
    159 client.on('close', () => {
    160     console.log('close')
    161 })
    162 
    163 client.start()

    参数说明:

    node.exe huya.js [虎牙房间号] [要存储目录的绝对路径] [文件名]

    编写调用 huya.js 的 批处理文件 huyaDanmu.cmd

    1 @echo off
    2 title %1 %3 %date% %time%
    3 D:
    ode-v8.9.1-win-x86
    ode.exe D:
    ode-v8.9.1-win-x86
    ode_moduleshuya-danmuhuya.js %1 %2 %3

    打开控制台窗口 输入 huyaDanmu [虎牙房间号] [要存储目录的绝对路径] [文件名]

    不输入存储目录时 直接保存到当前目录

    不输入文件名时 自动取名为 YYMMDD-HHMMSS_房间号.LRC 

    保存的格式是 LRC 歌词文件, 如果想转换 SRT 或者 ASS 格式也很方便, 利用新版 FFMpeg 就可以

    1 ffmpeg -i xxx.LRC xxx.SRT
    2 ffmpeg -i xxx.LRC xxx.ASS

    温馨提示: 录视频的同时运行 huyaDanmu 批处理命令, 就不用在调整时间轴;

  • 相关阅读:
    论文解读(GraphBert)《GraphBert: Only Attention is Needed for Learning Graph Representations》 Learner
    论文解读(SCAGC)《Selfsupervised Contrastive Attributed Graph Clustering》 Learner
    论文解读(AGE)《Adaptive Graph Encoder for Attributed Graph Embedding》 Learner
    tqdm介绍及常用方法 Learner
    论文解读(SCGC)《SCGC : SelfSupervised Contrastive Graph Clustering》 Learner
    论文解读《Strategies for Pretraining Graph Neural Networks》 Learner
    论文解读(FDGATII)《FDGATII : Fast Dynamic Graph Attention with Initial Residual and Identity Mapping》 Learner
    论文解读(GMIM)《Deep Graph Clustering via Mutual Information Maximization and Mixture Model》 Learner
    论文解读《Bilinear Graph Neural Network with Neighbor Interactions》 Learner
    AcWing 524. 愤怒的小鸟
  • 原文地址:https://www.cnblogs.com/nlsoft/p/10127922.html
Copyright © 2020-2023  润新知