Skip to content

Commit 324cd7c

Browse files
authored
feat: pipeline the computing tasks (#119)
* feat: pipeline the computing tasks fix #110
1 parent 718f377 commit 324cd7c

File tree

5 files changed

+51
-38
lines changed

5 files changed

+51
-38
lines changed

README.md

Lines changed: 28 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
## 2. Major features
2323

2424
<!-- - **速度快**:~~录制的同时可以选择启动无弹幕版视频的上传进程,下播即上线平台~~。(无弹幕版暂缓上线,等维护完成下一个版本上线) -->
25+
- **速度快**:采用 `pipeline` 流水线处理视频,理想情况下录播与直播相差半小时以内,没下播就能上线录播!
2526
- **多房间**:同时录制多个直播间内容视频以及弹幕文件(包含普通弹幕,付费弹幕以及礼物上舰等信息)。
2627
- **占用小**:自动删除本地已上传的视频,极致节省空间。
2728
- **模版化**:无需复杂配置,开箱即用,( :tada: NEW)通过 b 站搜索建议接口自动抓取相关热门标签。
@@ -34,24 +35,23 @@
3435

3536
```mermaid
3637
graph TD
37-
38-
User((用户))---->startRecord(启动录制)
38+
User((用户))--record-->startRecord(启动录制)
3939
startRecord(启动录制)--保存视频和字幕文件-->videoFolder[(Video 文件夹)]
4040
41-
User((用户))---->startUploadNoDanmaku(启动无弹幕版视频上传)
42-
videoFolder[(Video 文件夹)]<--实时上传-->startUploadNoDanmaku(启动无弹幕版视频上传)
43-
44-
User((用户))---->startScan(启动扫描 Video 文件夹)
41+
User((用户))--scan-->startScan(启动扫描 Video 文件夹)
4542
videoFolder[(Video 文件夹)]<--间隔两分钟扫描一次-->startScan(启动扫描 Video 文件夹)
46-
startScan --判断是否有弹幕-->ifDanmaku{判断}
43+
startScan <--视频文件--> whisper[whisperASR模型]
44+
whisper[whisperASR模型] --生成字幕-->parameter[查询视频分辨率]
45+
subgraph 启动新进程
46+
parameter[查询分辨率] -->ifDanmaku{判断}
4747
ifDanmaku -->|有弹幕| DanmakuFactory[DanmakuFactory]
48-
ifDanmaku -->|无弹幕| whisper[whisperASR模型]
49-
DanmakuFactory[DanmakuFactory] --自动转换弹幕--> whisper[whisperASR模型]
50-
whisper[whisperASR模型] --生成字幕--> ffmpeg1[ffmpeg]
51-
ffmpeg1[ffmpeg] --渲染字幕 --> uploadQueue[(上传队列)]
48+
ifDanmaku -->|无弹幕| ffmpeg1[ffmpeg]
49+
DanmakuFactory[DanmakuFactory] --根据分辨率转换弹幕--> ffmpeg1[ffmpeg]
50+
end
51+
ffmpeg1[ffmpeg] --渲染弹幕及字幕 --> uploadQueue[(上传队列)]
5252
53-
User((用户))---->startUpload(启动有弹幕版视频上传进程)
54-
startUpload(启动有弹幕版视频上传进程) <--扫描队列并上传视频--> uploadQueue[(上传队列)]
53+
User((用户))--upload-->startUpload(启动视频上传进程)
54+
startUpload(启动视频上传进程) <--扫描队列并上传视频--> uploadQueue[(上传队列)]
5555
```
5656

5757

@@ -92,7 +92,15 @@ pip install -r requirements.txt
9292
# 记录项目根目录
9393
./setPath.sh && source ~/.bashrc
9494
```
95-
以下功能默认开启,如果无 GPU,请直接看 4.2 节,并将 `src/allconfig.py` 文件中的 `GPU_EXIST` 参数设置为 `False`
95+
96+
项目大多数参数均在 `src/allconfig.py` 文件中,相关参数如下:
97+
+ GPU_EXIST 是否存在 GPU(以 `nvidia-smi` 显示驱动以及 `CUDA` 检查通过为主)
98+
+ MODEL_TYPE 渲染模式,
99+
+ `pipeline` 模式(默认): 目前最快的模式,需要 GPU 支持,最好在 `blrec` 设置片段为半小时以内,asr 识别和渲染并行执行,分 p 上传视频片段。
100+
+ `append` 模式: 基本同上,但 asr 识别与渲染过程串行执行,比 pipeline 慢预计 25%。
101+
+ `merge` 模式: 等待所有录制完成,再进行合并识别渲染过程,上传均为完整版录播。
102+
103+
以下功能默认开启,如果无 GPU,请直接看 4.2 节,并将 `src/allconfig.py` 文件中的 `GPU_EXIST` 参数设置为 `False`,并将 `MODEL_TYPE` 调整为 `merge` 或者 `append`
96104
如果需要使用自动识别并渲染字幕功能,模型参数及链接如下,注意 GPU 显存必须大于所需 VRAM:
97105

98106
| Size | Parameters | Multilingual model | Required VRAM |
@@ -110,40 +118,32 @@ pip install -r requirements.txt
110118
111119
### 4.2 biliup-rs 登录
112120

113-
首先按照 [biliup-rs](https://github.com/biliup/biliup-rs) 登录b站,将登录产生的`cookies.json`文件复制一份到项目根目录中
121+
首先按照 [biliup-rs](https://github.com/biliup/biliup-rs) 登录b站,登录脚本在 `src/upload/biliup` ,登录产生的`cookies.json`保留在该文件夹下即可
114122

115123
### 4.3 启动自动录制
116124

117-
-`startRecord.sh`启动脚本中设置端口 `port`
118-
-`settings.toml` 中设置视频存放目录、日志目录,也可在 blrec 前端界面即`http://localhost:port` 中进行设置。详见 [blrec](https://github.com/acgnhiki/blrec)
125+
-`record.sh`启动脚本中设置端口 `port`
126+
-`settings.toml` 中设置视频存放目录、日志目录,也可启动后在 blrec 前端界面即`http://localhost:port` 中进行设置。详见 [blrec](https://github.com/acgnhiki/blrec)
119127

120-
然后执行
128+
启动 blrec
121129

122130
```bash
123131
./record.sh
124132
```
125133
### 4.4 启动自动上传
126-
有弹幕版视频和无弹幕版视频的上传是独立的,可以同时进行,也可以单独启用。
127-
128-
#### 4.4.1 无弹幕版视频自动上传(WIP,下个版本上线,先跳过本步)
129-
130-
- 投稿的配置文件为 `upload_config.json`,可以参考给出的示例添加。
131-
- 请在将一级键值名称取为**字符串格式**的对应直播间的房间号(4位数以上)。
132-
133-
#### 4.4.2 弹幕版视频渲染与自动上传
134134

135135
> 请先确保你已经完成了 4.1 步骤,下载并放置了模型文件。
136136
> 否则,请将 `src/allconfig.py` 文件中的 `GPU_EXIST` 参数设置为 `False`
137137
138-
##### 启动弹幕渲染进程
138+
#### 启动扫描渲染进程
139139

140140
输入以下指令即可检测已录制的视频并且自动合并分段,自动进行弹幕转换,字幕识别与渲染的过程:
141141

142142
```bash
143143
./scan.sh
144144
```
145145

146-
##### 启动自动上传进程
146+
#### 启动自动上传进程
147147

148148
```bash
149149
./upload.sh

settings.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ enable_recorder = true
99
[output]
1010
path_template = "{roomid}/{roomid}_{year}{month}{day}-{hour}-{minute}-{second}"
1111
filesize_limit = 0
12-
duration_limit = 0
12+
duration_limit = 1200
1313
out_dir = "./Videos"
1414

1515
[logging]

src/allconfig.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,3 +14,6 @@
1414
BURN_LOG_PATH = os.path.join(BILIVE_DIR, 'logs', 'burningLog', f'burn-{datetime.now().strftime("%Y%m-%d-%H%M%S")}.log')
1515
MERGE_LOG_PATH = os.path.join(BILIVE_DIR, 'logs', 'mergeLog', f'merge-{datetime.now().strftime("%Y%m-%d-%H%M%S")}.log')
1616
GPU_EXIST=True
17+
MODEL_TYPE = "pipeline"
18+
# MODEL_TYPE = "append"
19+
# MODEL_TYPE = "merge"

src/burn/only_render.py

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,11 @@
33
import argparse
44
import os
55
import subprocess
6-
from src.allconfig import GPU_EXIST, SRC_DIR
6+
from src.allconfig import GPU_EXIST, SRC_DIR, MODEL_TYPE
77
from src.burn.generate_danmakus import get_resolution, process_danmakus
88
from src.burn.generate_subtitles import generate_subtitles
99
from src.burn.render_video import render_video
10+
import multiprocessing
1011

1112
def normalize_video_path(filepath):
1213
"""Normalize the video path to upload
@@ -34,7 +35,8 @@ def render_video_only(video_path):
3435

3536
# Generate the srt file via whisper model
3637
if GPU_EXIST:
37-
generate_subtitles(original_video_path)
38+
if MODEL_TYPE != "pipeline":
39+
generate_subtitles(original_video_path)
3840

3941
# Burn danmaku or subtitles into the videos
4042
render_video(original_video_path, format_video_path, subtitle_font_size, subtitle_margin_v)
@@ -52,6 +54,11 @@ def render_video_only(video_path):
5254
with open(f"{SRC_DIR}/upload/uploadVideoQueue.txt", "a") as file:
5355
file.write(f"{format_video_path}\n")
5456

57+
def pipeline_render(video_path):
58+
generate_subtitles(video_path)
59+
burn_process = multiprocessing.Process(target=render_video_only, args=(video_path,))
60+
burn_process.start()
61+
5562
if __name__ == '__main__':
5663
# Read and define variables
5764
parser = argparse.ArgumentParser(description='Danmaku burns')

src/burn/scan.py

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,10 @@
22

33
import os
44
from pathlib import Path
5-
from src.burn.only_render import render_video_only
5+
from src.burn.only_render import render_video_only, pipeline_render
66
from src.burn.render_and_merge import render_and_merge
77
import time
8-
from src.allconfig import VIDEOS_DIR
8+
from src.allconfig import VIDEOS_DIR, MODEL_TYPE
99

1010
def process_folder_merge(folder_path):
1111
# Don't process the recording folder
@@ -42,16 +42,19 @@ def process_folder_append(folder_path):
4242
mp4_files.sort()
4343
for file in mp4_files:
4444
print(f"Processing {file}...", flush=True)
45-
render_video_only(file)
45+
if MODEL_TYPE == "pipeline":
46+
pipeline_render(file)
47+
else:
48+
render_video_only(file)
4649

4750
if __name__ == "__main__":
4851
room_folder_path = VIDEOS_DIR
4952
while True:
5053
for room_folder in Path(room_folder_path).iterdir():
5154
if room_folder.is_dir():
52-
# This function use the merge mode to upload videos
53-
# process_folder_merge(room_folder)
54-
# This function use the append mode to upload videos
55-
process_folder_append(room_folder)
55+
if MODEL_TYPE == "merge":
56+
process_folder_merge(room_folder)
57+
else:
58+
process_folder_append(room_folder)
5659
print(f"{time.strftime('%Y-%m-%d %H:%M:%S')} There is no file recorded. Check again in 120 seconds.", flush=True)
5760
time.sleep(120)

0 commit comments

Comments
 (0)