Giter Site home page Giter Site logo

streamerhelper's Introduction

StreamerHelper

StreamerHelper

🍰 Never miss your Streamer again

MIT npm version nodejs version

Introduction

StreamerHelper 是一个主播录制工具,可以实时录制各平台直播保存为视频文件,并向B站自动投稿已缓存的文件。目前支持的平台有虎牙、斗鱼、B站、非洲台等。

(关于版权问题,投稿的参数默认一律设置的转载,简介处默认放有直播间链接)

部署

容器部署

首先安装 Docker。

# 本文以 /home/StreamerHelper/ 文件夹为例,作为应用的根目录。

# 拉取 Docker 镜像
docker pull umuoy1/streamerhelper
# 创建挂载目录
mkdir /home/StreamerHelper && cd /home/StreamerHelper && mkdir download/
# 下载配置文件保存到本地
curl https://raw.githubusercontent.com/umuoy1/StreamerHelper/master/templates/info-example.json >> info.json

通过以下指令运行容器。

docker run --name sh -itd \
-v /home/StreamerHelper/info.json:/app/templates/info.json \
-v /home/StreamerHelper/download:/app/download \
--dns 114.114.114.114 \
--restart always umuoy1/streamerhelper

如果没有配置access_token,则需要扫码登录。
具体操作方法如下,在控制台查看容器日志打印出二维码,然后通过B站移动客户端扫码登录。

# 打印日志中的二维码
docker logs sh

登陆成功后,录制任务自动开始。

直接部署

Linux & macOS

  1. 安装 Node.js,本文推荐使用 nvm 进行版本管理,安装 nvm 请参考官方教程,本教程不再赘述。
# 通过 nvm 安装 Node.js
nvm install --lts

# 检查安装成功
node -v
npm -v
  1. 安装 FFmpeg
# Ubuntu
sudo add-apt-repository universe
sudo apt update
sudo apt install ffmpeg

# Debian
sudo apt update
sudo apt install ffmpeg

# CentOS 7
sudo yum install epel-release
sudo yum localinstall --nogpgcheck https://download1.rpmfusion.org/free/el/rpmfusion-free-release-7.noarch.rpm
sudo yum install ffmpeg ffmpeg-devel

# CentOS 8
sudo yum-config-manager --add-repo=https://negativo17.org/repos/epel-multimedia.repo
sudo dnf install ffmpeg

# macOS
brew update
brew install ffmpeg

# 检查安装成功
ffmpeg
  1. 安装 pm2
npm i -g pm2 --registry=https://registry.npmmirror.com
# --registry=https://registry.npmmirror.com 为 npm 官方源代理
  1. 部署 StreamerHelper
git clone https://github.com/ZhangMingZhao1/StreamerHelper.git && cd StreamerHelper
npm i
npm run serve

Windows

  1. 安装 nvm 和 Node.js,直接从官方 Release 页面下载安装包运行即可。
  2. 安装 FFmpeg

官网下载二进制文件,解压到指定位置,比如C:\,然后将bin目录添加到系统环境变量path中。
image.png
image.png

  1. 安装 pm2
npm i -g pm2 --registry=https://registry.npmmirror.com
# --registry=https://registry.npmmirror.com 为 npm 官方源代理
  1. 部署 StreamerHelper
git clone https://github.com/ZhangMingZhao1/StreamerHelper.git && cd StreamerHelper
npm i
copy templates/info-example.json templates/info.json
npm run serve

修改配置

配置说明

目前不支持配置的热更新,更新配置后需要重启使配置生效。
配置项的说明如下,加粗表示必填字段:
字段名(默认值): 字段说明

  • StreamerHelper:
    • debug(false): 调试开关。
    • recycleCheckTime(300): 投稿检测间隔,单位秒。
    • roomCheckTime(600): 录制检测间隔,单位秒。
    • videoPartLimitSize(100): 投稿时忽略小于此大小的文件。
    • logLevel("error"): 此级别之上(包括)的日志将被推送,可选"TRACE"|"DEBUG"|"INFO"|"WARN"|"ERROR"。
    • push:
      • mail:
        • enable(true): 是否开启,开启时,以下字段均为必填。
        • host: STMP 服务主机。
        • port(465): STMP 服务端口。
        • from: STMP 服务邮箱,同时作为发送者邮箱。
        • pwd: STMP 服务密码。
        • to: 接受者邮箱。
        • secure(true): 是否开启安全服务
      • wechat:
        • enable: 是否开启,开启时,以下字段均为必填,该功能通过 Server 酱实现。
        • sendKey: Server 酱 sendKey
  • personInfo: 以下字段均为自动生成,如果选择 access_token 登录,需要手动填写 access_token。
    • nickname
    • access_token
    • refresh_token
    • expires_in
    • tokenSignDate
    • mid
    • cookies
  • streamerInfo: 一个数组,描述录制信息。
    • name: 主播名。
    • uploadLocalFile(true): 是否投稿。
    • deleteLocalFile(true): 是否删除本地视频文件。
    • delayTime(2): 投稿成功后延迟删除本地文件的时间(需要 deleteLocalFile 为 true),单位天。
    • templateTitle({{name}} {{time}} 录播): 稿件标题,支持占位符 {{name}} {{time}}
    • desc(Powered By StreamerHelper. https://github.com/ZhangMingZhao1/StreamerHelper): 稿件描述。
    • source({{name}} 直播间: {{roomUrl}}): 稿件直播源(需要copyright为2)。
    • dynamic({{name}} 直播间: {{roomUrl}}): 稿件动态。
    • copyright(2): 稿件来源,1 为自制 2 为转载。
    • roomUrl: 直播间地址。
    • tid: 稿件分区,详见tid表
    • tags: 稿件标签,至少一个,总数量不能超过12个,并且单个不能超过20个字,否则稿件投稿失败

例子

{
  "StreamerHelper": {
    "debug": false,
    "roomCheckTime": 600,
    "recycleCheckTime": 1800,
    "videoPartLimitSize": 100
      "logLevel": "error",
    "push": {
      "mail": {
        "enable": true,
        "host": "smtp.qq.com",
        "port": 465,
        "from": "***@qq.com",
        "pwd": "***",
        "to": "***@gmail.com",
        "secure": true
      },
      "wechat": {
        "enable": true,
        "sendKey": "***"
      }
    }
  },
  "personInfo": {
    "nickname": "",
    "access_token": "",
    "refresh_token": "",
    "expires_in": 0,
    "tokenSignDate": 0,
    "mid": 0,
    "cookies": ""
  },
  "streamerInfo": [
    {
      "name": "主播1",
      "uploadLocalFile": true,
      "deleteLocalFile": true,
      "templateTitle": "{{name}}{{time}} 直播",
      "delayTime": 0,
      "desc": "",
      "source": "",
      "dynamic": "",
      "copyright": 2,
      "roomUrl": "https://live.xxx.com/111",
      "tid": 121,
      "tags": [
        "tag1",
        "tag2",
        "tag3"
      ]
    },
    {
      "name": "主播2",
      "uploadLocalFile": true,
      "deleteLocalFile": false,
      "templateTitle": "{{name}}{{time}} 直播",
      "delayTime": 1,
      "desc": "",
      "source": "",
      "dynamic": "",
      "copyright": 2,
      "roomUrl": "https://live.xxx.com/222",
      "tid": 171,
      "tags": [
        "tag1",
        "tag2",
        "tag3"
      ]
    }
  ]
}

Environment

我们的测试机器配置以及环境如下:

cpu mem bps OS Node.js
Intel i5-4590 @ 3.30GHz 2GB 100m Ubuntu 18.04 12.18.3

可以同时下载4个主播,不会产生卡顿。

Contributor

@ZhangMingZhao1 @umuoy1 @ni00 @daofeng2015 @FortuneDayssss @bulai0408 @zsnmwy

Thanks:

TodoList

  • 支持斗鱼,虎牙,b站直播,afreeca,抖音直播快手直播,西瓜直播,花椒直播,YY 直播,战旗直播,酷狗繁星,NOW 直播,CC 直播,企鹅电竞直播
  • 自动监测主播在线
  • 自动上传b站
  • 多p下载多p上传
  • 支持多个主播
  • tag可配置,对应在info.json的每个主播
  • 支持access_token验证,防验证码
  • 重启后同时检测本地是否有上传失败的视频文件,并上传。
  • 爬虫定时区间,节省服务器流量,现支持配置房间检测间隔
  • 支持docker部署
  • 上传文件大小监测,解决主播断流问题出现很多小切片导致上传审核失败
  • 增加一个独立脚本遍历download文件夹下的视频文件重新上传(重启上传的折中解决办法,还有解决第一次账号密码配置错误失败上传的问题)
  • 支持twitch
  • 规范化log,完善debug log

Example

例子

见:https://space.bilibili.com/3356199 或者 https://space.bilibili.com/11314291

Tips

建议使用管口大的vps,否则上传下载速度可能会受影响。更新后请及时拉取像或git pull重新pm2 stop && npm run serve。vps比较低配的话配置的主播数量不要太多,也要注意vps的磁盘大小。日志文件会自动创建,在./logs/下。

有问题加qq群1142141023,备注streamerHelper

请开发者喝杯咖啡

您的捐赠和star是开发者持续维护的最大动力!

streamerhelper's People

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

streamerhelper's Issues

磁盘容量不足时的保护策略

考虑部分用户并没有使用大容量的机器进行录制,比如群晖。容易发生打满磁盘的情况,目前 StreamerHelper 并未对此做任何处理,磁盘打满会严重影响机器的允许,在磁盘容量不足的情况下做出反应是否可行,以及如何处理。
一种最简单的方案是停止下载进程,待所有文件上传完毕后继续恢复下载。

登录bilibili失败

image
[2021-07-30T11:22:37.818] [INFO] APP - initUnCaughtException
[2021-07-30T11:22:37.820] [INFO] User - Check token
[2021-07-30T11:22:37.820] [ERROR] User - Access Token not define
[2021-07-30T11:22:37.882] [ERROR] User - An error occurred when getKey: Error: Request failed with status code 412

关于参数delayTime的疑问

请问delayTime这个非必选参数为什么会有一个默认值2天?我如果不填这个参数的话,上传成功后也会等两天才删除旧文件吗?
如果我想上传成功后立即删除旧文件的话,要明确给出参数delayTime并指定为0吗?

支持清晰度选择

目前是以website plugins获取的链接进行直录,在大部分情况下是源画质。是否考虑允许website plugins提供更多的信息,支持用户选择不同的清晰度进行录制。

请问能否加入帧率选择?

请问能否加入帧率选择?比如将所有视频都转为30帧?我尝试直接在ffmpeg中加入-r 30参数,实际下载的视频仍为60帧

B站直播流收取失败

download 文件夹中全是几十B的文件碎片,无法播放

log 无限循环:

开始下载 --> 子进程退出,退出码 1 --> 断流,但直播间仍在线,继续下载

上传视频分块时报错

使用 Docker,报错信息如下:

[ERROR] APP - exception caught:  TypeError: Cannot read property 'failUpload' of undefined
    at merge (/app/dist/uploader/index.js:371:64)
    at merge (/app/dist/uploader/index.js:371:52)
    at uploader.changeFileStatus (/app/dist/uploader/index.js:381:17)
    at ReadStream.<anonymous> (/app/dist/uploader/index.js:201:38)
    at runMicrotasks (<anonymous>)
    at processTicksAndRejections (node:internal/process/task_queues:96:5)

请问能不能保存本地文件

能不能给个开关保留下本地文件,不要马上就删除。

因为B站经常因为审核或者转码出问题而不过审,没有备份文件想补救都没办法。

上传完成后移动去另外一个文件夹,比如: uploaded 之类,按天数或者文件大小保存,超过天数或者保存大小自动删除。

原来已经有了,感谢。

西瓜直播

现在已经有代码实现。src/engine/website/ixigua.ts

暂且记录一下获取流程以及相关字段。

  1. 通过直接curl直播页面,可以从最下面的标签拿到JSON数据。
curl https://live.ixigua.com/175762/

标签 <script type="application/json" id="SSR_HYDRATED_DATA">

提取标签内容

curl https://live.ixigua.com/175762/ | grep '<script type="application/json" id="SSR_HYDRATED_DATA">' | cut -d '>' -f2 | rev | cut -d '<' -f2 | rev | jq
{
    "homeFeedData": [],
    "homeBannerData": {},
    "youQingLinks": [],
    "sideBarExpand": true,
    "sideBarData": [
        {
            "name": "我的关注",
            "id": 156,
            "icon": "https://sf1-xgcdn-tos.pstatp.com/obj/xigua-live-admin/live/f0595119513d4ec72b93f726347d4fe4.png",
            "shortName": "关注",
            "childs": []
        },
        {
            "name": "全部直播",
            "id": 109,
            "icon": "https://sf1-xgcdn-tos.pstatp.com/obj/xigua-live-admin/live/8aeebc417e68d64f47d59a88ce7fd00b.png",
            "shortName": "全部",
            "childs": []
        },
        {
            "name": "网游竞技",
            "id": 71,
            "icon": "https://sf1-xgcdn-tos.pstatp.com/obj/xigua-live-admin/live/d4c52ff31949c07cdcefd62fac8b4c8d.png",
            "shortName": "网游",
            "childs": [
                {
                    "name": "吃鸡端游",
                    "id": 74
                },
                {
                    "name": "DOTA",
                    "id": 172
                },
                {
                    "name": "棋牌游戏",
                    "id": 106
                },
                {
                    "name": "热门网游",
                    "id": 107
                },
                {
                    "name": "CS:GO",
                    "id": 190
                },
                {
                    "name": "Apex英雄",
                    "id": 157
                },
                {
                    "name": "星际争霸",
                    "id": 187
                },
                {
                    "name": "守望先锋",
                    "id": 188
                },
                {
                    "name": "逆水寒",
                    "id": 73
                }
            ]
        },
        {
            "name": "手机游戏",
            "id": 95,
            "icon": "https://sf1-xgcdn-tos.pstatp.com/obj/xigua-live-admin/live/5a26bb9b325c39d6763e19f418b43079.png",
            "shortName": "手游",
            "childs": [
                {
                    "name": "第五人格",
                    "id": 78
                },
                {
                    "name": "战争艺术",
                    "id": 232
                },
                {
                    "name": "吃鸡手游",
                    "id": 75
                },
                {
                    "name": "迷你世界",
                    "id": 76
                },
                {
                    "name": "猫和老鼠",
                    "id": 184
                },
                {
                    "name": "香肠派对",
                    "id": 104
                },
                {
                    "name": "综合手游",
                    "id": 251
                },
                {
                    "name": "荒野行动",
                    "id": 208
                },
                {
                    "name": "梦幻手游",
                    "id": 203
                },
                {
                    "name": "明日之后",
                    "id": 153
                },
                {
                    "name": "灌篮高手",
                    "id": 279
                }
            ]
        },
        {
            "name": "主机单机",
            "id": 96,
            "icon": "https://sf3-xgcdn-tos.pstatp.com/obj/xigua-live-admin/live/c8a5b70b7b8fdaabf92732471c8ae3db.png",
            "shortName": "单机",
            "childs": [
                {
                    "name": "主机游戏",
                    "id": 97
                },
                {
                    "name": "我的世界",
                    "id": 98
                },
                {
                    "name": "怀旧经典",
                    "id": 99
                },
                {
                    "name": "二次元",
                    "id": 216
                }
            ]
        },
        {
            "name": "音乐",
            "id": 113,
            "icon": "https://sf1-xgcdn-tos.pstatp.com/obj/xigua-live-admin/live/132af14d16a7e1abc6923abf51db294a.png",
            "shortName": "音乐",
            "childs": [
                {
                    "name": "才艺",
                    "id": 82
                },
                {
                    "name": "唱歌",
                    "id": 116
                },
                {
                    "name": "颜值",
                    "id": 114
                }
            ]
        },
        {
            "name": "乡野",
            "id": 117,
            "icon": "https://sf3-xgcdn-tos.pstatp.com/obj/xigua-live-admin/live/27c37a673359312d83ad33fdfd890b93.png",
            "shortName": "乡野",
            "childs": [
                {
                    "name": "农耕劳作",
                    "id": 118
                },
                {
                    "name": "户外打野",
                    "id": 119
                },
                {
                    "name": "田园风光",
                    "id": 121
                },
                {
                    "name": "畅聊农村",
                    "id": 122
                }
            ]
        },
        {
            "name": "生活",
            "id": 135,
            "icon": "https://sf3-xgcdn-tos.pstatp.com/obj/xigua-live-admin/live/fcfd5243522918e15049c4f68d453521.png",
            "shortName": "生活",
            "childs": [
                {
                    "name": "美食",
                    "id": 85
                },
                {
                    "name": "旅游",
                    "id": 87
                },
                {
                    "name": "情感",
                    "id": 84
                },
                {
                    "name": "体育",
                    "id": 86
                }
            ]
        }
    ],
    "roomData": {
        "id": "6940035836591328036",
        "coverURI": "post-meta/215780139/push-rtmp-l6.ixigua.com/game/stream-108439767142367662/xigua1/20210316080641185.jpg",
        "createTime": 1615880718,
        "status": 2,
        "title": "第五人格:别问,问就是蓝天白云",
        "categoryName": "第五人格",
        "baseCategoryName": "手机游戏",
        "category": 33,
        "categoryToID": "78",
        "categoryToName": "第五人格",
        "baseCategory": 67,
        "baseCategoryToID": "95",
        "baseCategoryToName": "手机游戏",
        "popularity": "5",
        "playInfo": [
            {
                "FlvUrl": "http://pull-flv-l6.ixigua.com/game/stream-108439767142367662.flv",
                "HlsUrl": "http://pull-hls-l6.ixigua.com/game/stream-108439767142367662/index.m3u8",
                "Name": "原画",
                "Resolution": "ORIGIN"
            },
            {
                "FlvUrl": "http://pull-flv-l6.ixigua.com/game/stream-108439767142367662_uhd.flv",
                "HlsUrl": "http://pull-hls-l6.ixigua.com/game/stream-108439767142367662_uhd/index.m3u8",
                "Name": "蓝光 1080P",
                "Resolution": "FULL_HD1"
            },
            {
                "FlvUrl": "http://pull-flv-l6.ixigua.com/game/stream-108439767142367662_hd.flv",
                "HlsUrl": "http://pull-hls-l6.ixigua.com/game/stream-108439767142367662_hd/index.m3u8",
                "Name": "超清 720P",
                "Resolution": "HD1"
            },
            {
                "FlvUrl": "http://pull-flv-l6.ixigua.com/game/stream-108439767142367662_sd.flv",
                "HlsUrl": "http://pull-hls-l6.ixigua.com/game/stream-108439767142367662_sd/index.m3u8",
                "Name": "高清 540P",
                "Resolution": "SD2"
            },
            {
                "FlvUrl": "https://pull-flv-l6-admin.ixigua.com/game/stream-108439767142367662_md.flv?session_id=000-2021031616065201020603601329008E7C",
                "HlsUrl": "http://pull-hls-l6.ixigua.com/game/stream-108439767142367662_md/index.m3u8?session_id=000-2021031616065201020603601329008E7C",
                "Name": "流畅 360P",
                "Resolution": "REVIEW"
            }
        ],
        "authStatus": {
            "0": true,
            "1": true,
            "2": true,
            "3": true,
            "4": true
        },
        "anchorInfo": {
            "id": "4014473445",
            "name": "落忘解说",
            "description": "热爱动漫,享受游戏。像风一样自由。",
            "avatarUrl": "https://p1.pstatp.com/img/mosaic-legacy/dacf000e98183ccb9bf5~c5_300x300.image",
            "followersCount": 106504,
            "followingCount": 43,
            "fanPiao": 741942,
            "follow": false,
            "shortId": "175762"
        },
        "ownerUserId": 4014473445,
        "fcdnAppId": 100003,
        "giftList": [
            {
                "ID": 950,
                "Name": "好柿花生",
                "Describe": "送出好柿花生",
                "DiamondCount": 6,
                "Meta": {
                    "icon_uri": "webcast/7074332b98f3b1cf38d97554f1b95e1f.png"
                }
            },
            {
                "ID": 836,
                "Name": "小雪花",
                "Describe": "送出小雪花",
                "DiamondCount": 1,
                "Meta": {
                    "icon_uri": "webcast/21a878bd946118ca9fc2fc2fd5b546ee"
                }
            },
            {
                "ID": 940,
                "Name": "小雪人",
                "Describe": "送出小雪人",
                "DiamondCount": 99,
                "Meta": {
                    "icon_uri": "webcast/7c745617e395b083442b71abfec769b6.png"
                }
            },
            {
                "ID": 585,
                "Name": "吃口药",
                "Describe": "赶快吃口药",
                "DiamondCount": 1,
                "Meta": {
                    "icon_uri": "webcast/320ef8f934aec4d75d1f668f4c60a54f"
                }
            },
            {
                "ID": 592,
                "Name": "三级头",
                "Describe": "炫酷三级头",
                "DiamondCount": 10,
                "Meta": {
                    "icon_uri": "78a100963429b66df528"
                }
            },
            {
                "ID": 885,
                "Name": "mojito",
                "Describe": "送出mojito",
                "DiamondCount": 10,
                "Meta": {
                    "icon_uri": "webcast/cf35bde69dcde523455f21c05a1b0f3e.png"
                }
            },
            {
                "ID": 862,
                "Name": "热干面",
                "Describe": "来碗热干面",
                "DiamondCount": 66,
                "Meta": {
                    "icon_uri": "2d050003af37094f39f4d"
                }
            },
            {
                "ID": 705,
                "Name": "棒棒糖",
                "Describe": "甜蜜似糖",
                "DiamondCount": 1,
                "Meta": {
                    "icon_uri": "78a700d7fc42bf722426"
                }
            },
            {
                "ID": 806,
                "Name": "比心",
                "Describe": "比个心心",
                "DiamondCount": 99,
                "Meta": {
                    "icon_uri": "2d04c0006e454f9cdfcda"
                }
            },
            {
                "ID": 759,
                "Name": "玫瑰",
                "Describe": "小玫瑰",
                "DiamondCount": 2,
                "Meta": {
                    "icon_uri": "2d050000807c079b4e389"
                }
            },
            {
                "ID": 773,
                "Name": "荧光棒",
                "Describe": "打call",
                "DiamondCount": 6,
                "Meta": {
                    "icon_uri": "webcast/6188733ce65d55a0fe3afd2e27b7835c"
                }
            }
        ],
        "mediaLiveAuth": false,
        "orientation": 1,
        "danmakuConfig": {
            "data": [
                {
                    "type": 2,
                    "level": 2
                }
            ]
        },
        "liveSource": [
            {
                "room_id": "6940035836591328036",
                "title": "第五人格:别问,问就是蓝天白云",
                "cover_url": "http://sf6-xgcdn-tos.pstatp.com/img/post-meta/215780139/push-rtmp-l6.ixigua.com/game/stream-108439767142367662/xigua1/20210316080645183.jpg~c5_580x327.jpeg",
                "user_id": "4014473445",
                "watching_count": 5,
                "category_name": "第五人格",
                "user_avatar": "https://p1.pstatp.com/img/mosaic-legacy/dacf000e98183ccb9bf5~c5_300x300.image",
                "user_name": "落忘解说",
                "live_start_time": 1615880734,
                "short_id": 175762
            },
            {
                "room_id": "6939849927447087908",
                "title": "魔兽手游,手机版的魔兽世界怀旧服",
                "cover_url": "http://sf6-xgcdn-tos.pstatp.com/img/post-meta/1802807038/push-rtmp-l6.ixigua.com/game/stream-108438865400562094/xigua1/20210316080643855.jpg~c5_580x327.jpeg",
                "user_id": "2181083985633480",
                "watching_count": 1,
                "category_name": "第五人格",
                "user_avatar": "https://sf3-ttcdn-tos.pstatp.com/img/pgc-image/23828d90bd0047a29353e6ae775a43f5~c5_300x300.image",
                "user_name": "U6游戏",
                "live_start_time": 1615867432,
                "short_id": 1624949
            },
            {
                "room_id": "6940108596155910947",
                "title": "点个关注上车",
                "cover_url": "http://sf6-xgcdn-tos.pstatp.com/img/post-meta/1141277392/push-rtmp-l6.ixigua.com/game/stream-684900550047957422/xigua1/20210316080644909.jpg~c5_580x327.jpeg",
                "user_id": "2748426119823192",
                "watching_count": 1,
                "category_name": "第五人格",
                "user_avatar": "https://sf6-ttcdn-tos.pstatp.com/img/user-avatar/07d425c367bd0062d4967152c010a617~c5_300x300.image",
                "user_name": "Rain沐心",
                "live_start_time": 1615879411,
                "short_id": 1669224
            },
            {
                "room_id": "6939536209249078023",
                "title": "新【武侠】开局648",
                "cover_url": "http://sf6-xgcdn-tos.pstatp.com/img/post-meta/3825058396/push-rtmp-l6.ixigua.com/game/stream-108433520919839150/xigua1/20210315224137948.jpg~c5_580x327.jpeg",
                "user_id": "94478645188",
                "watching_count": 0,
                "category_name": "第五人格",
                "user_avatar": "https://sf6-ttcdn-tos.pstatp.com/img/tos-cn-i-0022/52959f1cc7e345178d72f2d99aa2d02e~c5_300x300.image",
                "user_name": "拥护太阳的我",
                "live_start_time": 1615789728,
                "short_id": 1089493
            }
        ]
    },
    "recommendData": [
        {
            "room_id": "6940035836591328036",
            "title": "第五人格:别问,问就是蓝天白云",
            "cover_url": "http://sf6-xgcdn-tos.pstatp.com/img/post-meta/215780139/push-rtmp-l6.ixigua.com/game/stream-108439767142367662/xigua1/20210316080645183.jpg~c5_580x327.jpeg",
            "user_id": "4014473445",
            "watching_count": 5,
            "category_name": "第五人格",
            "user_avatar": "https://p1.pstatp.com/img/mosaic-legacy/dacf000e98183ccb9bf5~c5_300x300.image",
            "user_name": "落忘解说",
            "live_start_time": 1615880734,
            "short_id": 175762
        },
        {
            "room_id": "6939849927447087908",
            "title": "魔兽手游,手机版的魔兽世界怀旧服",
            "cover_url": "http://sf6-xgcdn-tos.pstatp.com/img/post-meta/1802807038/push-rtmp-l6.ixigua.com/game/stream-108438865400562094/xigua1/20210316080643855.jpg~c5_580x327.jpeg",
            "user_id": "2181083985633480",
            "watching_count": 1,
            "category_name": "第五人格",
            "user_avatar": "https://sf3-ttcdn-tos.pstatp.com/img/pgc-image/23828d90bd0047a29353e6ae775a43f5~c5_300x300.image",
            "user_name": "U6游戏",
            "live_start_time": 1615867432,
            "short_id": 1624949
        },
        {
            "room_id": "6940108596155910947",
            "title": "点个关注上车",
            "cover_url": "http://sf6-xgcdn-tos.pstatp.com/img/post-meta/1141277392/push-rtmp-l6.ixigua.com/game/stream-684900550047957422/xigua1/20210316080644909.jpg~c5_580x327.jpeg",
            "user_id": "2748426119823192",
            "watching_count": 1,
            "category_name": "第五人格",
            "user_avatar": "https://sf6-ttcdn-tos.pstatp.com/img/user-avatar/07d425c367bd0062d4967152c010a617~c5_300x300.image",
            "user_name": "Rain沐心",
            "live_start_time": 1615879411,
            "short_id": 1669224
        },
        {
            "room_id": "6939536209249078023",
            "title": "新【武侠】开局648",
            "cover_url": "http://sf6-xgcdn-tos.pstatp.com/img/post-meta/3825058396/push-rtmp-l6.ixigua.com/game/stream-108433520919839150/xigua1/20210315224137948.jpg~c5_580x327.jpeg",
            "user_id": "94478645188",
            "watching_count": 0,
            "category_name": "第五人格",
            "user_avatar": "https://sf6-ttcdn-tos.pstatp.com/img/tos-cn-i-0022/52959f1cc7e345178d72f2d99aa2d02e~c5_300x300.image",
            "user_name": "拥护太阳的我",
            "live_start_time": 1615789728,
            "short_id": 1089493
        }
    ],
    "userInfo": null,
    "msgList": null,
    "anchorInfo": {
        "id": "4014473445",
        "name": "落忘解说",
        "description": "热爱动漫,享受游戏。像风一样自由。",
        "avatarUrl": "https://p1.pstatp.com/img/mosaic-legacy/dacf000e98183ccb9bf5~c5_300x300.image",
        "followersCount": 106504,
        "followingCount": 43,
        "fanPiao": 741942,
        "follow": false,
        "shortId": "175762"
    },
    "giftList": [
        {
            "ID": 950,
            "Name": "好柿花生",
            "Describe": "送出好柿花生",
            "DiamondCount": 6,
            "Meta": {
                "icon_uri": "webcast/7074332b98f3b1cf38d97554f1b95e1f.png"
            }
        },
        {
            "ID": 836,
            "Name": "小雪花",
            "Describe": "送出小雪花",
            "DiamondCount": 1,
            "Meta": {
                "icon_uri": "webcast/21a878bd946118ca9fc2fc2fd5b546ee"
            }
        },
        {
            "ID": 940,
            "Name": "小雪人",
            "Describe": "送出小雪人",
            "DiamondCount": 99,
            "Meta": {
                "icon_uri": "webcast/7c745617e395b083442b71abfec769b6.png"
            }
        },
        {
            "ID": 585,
            "Name": "吃口药",
            "Describe": "赶快吃口药",
            "DiamondCount": 1,
            "Meta": {
                "icon_uri": "webcast/320ef8f934aec4d75d1f668f4c60a54f"
            }
        },
        {
            "ID": 592,
            "Name": "三级头",
            "Describe": "炫酷三级头",
            "DiamondCount": 10,
            "Meta": {
                "icon_uri": "78a100963429b66df528"
            }
        },
        {
            "ID": 885,
            "Name": "mojito",
            "Describe": "送出mojito",
            "DiamondCount": 10,
            "Meta": {
                "icon_uri": "webcast/cf35bde69dcde523455f21c05a1b0f3e.png"
            }
        },
        {
            "ID": 862,
            "Name": "热干面",
            "Describe": "来碗热干面",
            "DiamondCount": 66,
            "Meta": {
                "icon_uri": "2d050003af37094f39f4d"
            }
        },
        {
            "ID": 705,
            "Name": "棒棒糖",
            "Describe": "甜蜜似糖",
            "DiamondCount": 1,
            "Meta": {
                "icon_uri": "78a700d7fc42bf722426"
            }
        },
        {
            "ID": 806,
            "Name": "比心",
            "Describe": "比个心心",
            "DiamondCount": 99,
            "Meta": {
                "icon_uri": "2d04c0006e454f9cdfcda"
            }
        },
        {
            "ID": 759,
            "Name": "玫瑰",
            "Describe": "小玫瑰",
            "DiamondCount": 2,
            "Meta": {
                "icon_uri": "2d050000807c079b4e389"
            }
        },
        {
            "ID": 773,
            "Name": "荧光棒",
            "Describe": "打call",
            "DiamondCount": 6,
            "Meta": {
                "icon_uri": "webcast/6188733ce65d55a0fe3afd2e27b7835c"
            }
        }
    ],
    "ending": false,
    "blockPlay": false,
    "categoryFeedData": null,
    "searchData": {},
    "anchorData": {},
    "noticeData": {},
    "errorInfo": [],
    "chargeDialogInitType": "main",
    "chargeDialogShowing": false,
    "quickChargeData": null,
    "discipulus": null,
    "userInfoInitializing": true,
    "hostname": "live.ixigua.com",
    "isMobile": false,
    "punishStatus": {}
}
  1. 视频流

原画的JSON路径 JSON.roomData.playInfo[0].HlsUrl

curl https://live.ixigua.com/175762/ | grep '<script type="application/json" id="SSR_HYDRATED_DATA">' | cut -d '>' -f2 | rev | cut -d '<' -f2 | rev | jq '.roomData.playInfo'
[
  {
    "FlvUrl": "http://pull-flv-l6.ixigua.com/game/stream-108439767142367662.flv",
    "HlsUrl": "http://pull-hls-l6.ixigua.com/game/stream-108439767142367662/index.m3u8",
    "Name": "原画",
    "Resolution": "ORIGIN"
  },
  {
    "FlvUrl": "http://pull-flv-l6.ixigua.com/game/stream-108439767142367662_uhd.flv",
    "HlsUrl": "http://pull-hls-l6.ixigua.com/game/stream-108439767142367662_uhd/index.m3u8",
    "Name": "蓝光 1080P",
    "Resolution": "FULL_HD1"
  },
  {
    "FlvUrl": "http://pull-flv-l6.ixigua.com/game/stream-108439767142367662_hd.flv",
    "HlsUrl": "http://pull-hls-l6.ixigua.com/game/stream-108439767142367662_hd/index.m3u8",
    "Name": "超清 720P",
    "Resolution": "HD1"
  },
  {
    "FlvUrl": "http://pull-flv-l6.ixigua.com/game/stream-108439767142367662_sd.flv",
    "HlsUrl": "http://pull-hls-l6.ixigua.com/game/stream-108439767142367662_sd/index.m3u8",
    "Name": "高清 540P",
    "Resolution": "SD2"
  },
  {
    "FlvUrl": "https://pull-flv-l6-admin.ixigua.com/game/stream-108439767142367662_md.flv?session_id=000-202103161632080102020551500400E587",
    "HlsUrl": "http://pull-hls-l6.ixigua.com/game/stream-108439767142367662_md/index.m3u8?session_id=000-202103161632080102020551500400E587",
    "Name": "流畅 360P",
    "Resolution": "REVIEW"
  }
]
  1. 直播间是否开播(没有详细确认过)

roomData.status

备注
2 直播中
4 主播暂时不在播

上传速率慢

上传速率太慢 达不到宽带上传带宽
有什么解决办法吗 多线程还是改配置文件
谢谢了

【建议】希望可以增加一些文本占位符

编辑标题/描述/动态信息的时候感觉限制太大了,要么选择默认的格式,要么只能完全固定,后期还需要手动调整

建议增加一些占位符便于自行搭配格式,例如:直播间地址/主播名/录制时间/开播时间/最后结束录制时间这类

清晰度以及直播间号的问题

目前体验下来暂时发现两个问题,一是斗鱼的直播间号必须填原始的,不能填短号,否者获取不到,第二是默认选择的画质为蓝光4M,并不是最清晰的原画画质

关于录制的清晰度问题

同样是虎牙有些主播50min大约1g多,有的50min5g播的时间久一点内存就占满了服务器放不下,有没有能修改清晰度的方法

概率出现上传时候,第1/n 分块后出错

Upload chunk error: Error: getaddrinfo ENOTFOUND upcdn-szhw.bilivideo.com , retry in 10 seconds...

上述提示出现若干次后,提示

投稿失败:An error occurred when upload: An error occurred when upload video part: An error occurred when upload chunk: Error: getaddrinfo ENOTFOUND upcdn-szhw.bilivideo.com

上传视频报错

image
image

上传chunk的时候,目前出现了两种错误:”socket hang up“和”method not allowed“,导致上传中断失败,复现率较高

[建议] 对每个直播间增加是否投稿、是否删除的开关

建议在 streamerInfo 中加入一项配置,独立控制 是否对该直播间的录制视频进行投稿。
同理,也可以加一个是否在完成后删除源文件的控制项。

起因是有些直播间只想自己录来珍藏,不想传到网上。
但有些又需要传。
除非用两台机器各自处理,但这样比较浪费资源,嗯……

企鹅电竞判断主播开播状态问题,导致未开播的主播也会一直尝试录制

企鹅电竞的api根据房间号获取的json数据,无论是否开播都有直播流的地址,项目中缺失了对关播时间的判断,导致未开播的主播也会一直尝试下载。

if (jsons["ecode"] == 0) {

wiki中access token非必填,但如果不配置会持续报错无法开始录制。

[2021-07-08T21:40:28.585] [INFO] APP - initUnCaughtException
[2021-07-08T21:40:28.587] [INFO] User - Check token
[2021-07-08T21:40:28.587] [ERROR] User - Access Token not define
[2021-07-08T21:40:28.686] [ERROR] User - An error occurred when try to check token: TypeError: Cannot read property 'mid' of undefined
[2021-07-08T21:40:28.759] [INFO] User - sessionID ampbjqim
[2021-07-08T21:40:29.000] [INFO] User - JSESSIONID 57B0C0DC083B1FE83F110702E1B1FB8A

日志如上,请问这个token要如何获取?

上传投稿出现投稿失败

投稿时提示第一个提示投稿失败:Upload failed: {"code":21011,"message":"新增稿件分P不能为空","ttl":1}

[第二个错误P3]
QQ截图20210102192950
QQ截图20210102193018

uplaod ended, returns {"OK": 1, "info": "Successful."}
[2021-01-02T01:08:32.533] [INFO] message - Upload ended, returns:, {"code":0,"message":"0","ttl":1,"data":{"aid":628433562,"bvid":"BV1At4y1r7oL"}}
[2021-01-02T01:08:32.533] [INFO] cheese - Upload ended, returns:, {"code":0,"message":"0","ttl":1,"data":{"aid":628433562,"bvid":"BV1At4y1r7oL"}}
[2021-01-02T01:08:32.643] [INFO] cheese - 删除本地文件 /home/ubuntu/StreamerHelper/download/MH、小白白/2021-01-01

启动失败

[root@VM-8-12-centos StreamerHelper]# npm run serve

> [email protected] serve /root/StreamerHelper
> npm run build && pm2 start ./dist/app.js


> [email protected] build /root/StreamerHelper
> tsc

/usr/lib/node_modules/pm2/node_modules/chalk/source/index.js:103
	...styles,
	^^^

SyntaxError: Unexpected token ...
    at createScript (vm.js:56:10)
    at Object.runInThisContext (vm.js:97:10)
    at Module._compile (module.js:549:28)
    at Object.Module._extensions..js (module.js:586:10)
    at Module.load (module.js:494:32)
    at tryModuleLoad (module.js:453:12)
    at Function.Module._load (module.js:445:3)
    at Module.require (module.js:504:17)
    at require (internal/module.js:20:19)
    at Object.<anonymous> (/usr/lib/node_modules/pm2/constants.js:10:14)

npm ERR! Linux 3.10.0-1127.13.1.el7.x86_64
npm ERR! argv "/usr/bin/node" "/usr/bin/npm" "run" "serve"
npm ERR! node v6.17.1
npm ERR! npm  v3.10.10
npm ERR! code ELIFECYCLE
npm ERR! [email protected] serve: `npm run build && pm2 start ./dist/app.js`
npm ERR! Exit status 1
npm ERR! 
npm ERR! Failed at the [email protected] serve script 'npm run build && pm2 start ./dist/app.js'.
npm ERR! Make sure you have the latest version of node.js and npm installed.
npm ERR! If you do, this is most likely a problem with the streamer_helper package,
npm ERR! not with npm itself.
npm ERR! Tell the author that this fails on your system:
npm ERR!     npm run build && pm2 start ./dist/app.js
npm ERR! You can get information on how to open an issue for this project with:
npm ERR!     npm bugs streamer_helper
npm ERR! Or if that isn't available, you can get their info via:
npm ERR!     npm owner ls streamer_helper
npm ERR! There is likely additional logging output above.

npm ERR! Please include the following file with any support request:
npm ERR!     /root/StreamerHelper/npm-debug.log

会出现部分投稿卡审核

首先非常感谢编写此项目的大佬们!让我可以非常简单的做到自动录播自动投稿!

在接近快半个月的使用情况下来后,我发现15天里有2天的投稿是一直处于卡审核的状态(不是审核不通过,状态一直是审核中)

想问下有没有人和我遇到类似情况。

后续是否可以增加一个开关,支持保留文件! 因为这样如果遇到卡审核的情况,可以重新投一下呢

【咨询】请问有视频管理分段的功能吗?

就是视频管理分段的功能,每录播一小时就切一段。
我这边睡一觉起来发现视频录播有四个录播文件。
是什么原因导致的视频分段。
服务器是部署在腾讯云上的一个VPS。

另外有,那种可以在录播结束后合并将分段视频的功能吗?

打包失败.模块问题

src/engine/message.ts:4:17 - error TS2305: Module '"child_process"' has no exported member 'ChildProcessWithoutNullStreams'.

4 import { spawn, ChildProcessWithoutNullStreams } from "child_process";
                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

src/uploader/caller.ts:3:27 - error TS2307: Cannot find module 'type/VideoPart'.

3 import { VideoPart } from "type/VideoPart";
                            ~~~

好像就是3天前pr的代码有问题

如何设置上传的分块

我的是国外的vps 千兆带宽 今天测试了下 600多MB的文件被分成了131块,出方向的流量经常不动,不知道是不是分块数太多导致的,想修改下分块数量试试看。
图片
图片

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.