zoukankan      html  css  js  c++  java
  • 虎牙直播弹幕转换字幕格式 基于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 批处理命令, 就不用在调整时间轴;

  • 相关阅读:
    bootstrap4 Reboot details summary 美化(点选禁止选中文本,单行隐藏角标,多行后移)
    在C#中,Newtonsoft.Json + dynamic动态解析jsonString,jsonString转实体
    在C#中,Windows Console控制台 设置控制台标题、禁用关闭按钮、关闭快速编辑模式、插入模式
    MySql数据库中,判断表、表字段是否存在,不存在就新增
    Windows 10安装Docker 步骤及顺序
    AES加密解密 助手类 CBC加密模式
    处理模板页菜单高亮
    C# 按不同的字节编码,通过字节数去截取字符串
    2018年4月13日,祝自己24岁生日快乐!
    一个数值保存复选框的值
  • 原文地址:https://www.cnblogs.com/nlsoft/p/10127922.html
Copyright © 2011-2022 走看看