仁暮的博客

抽刀断水水更流,举杯消愁愁更愁

0%

打造你的录播工作流

前言

最近在看雪糕麻麻的直播,沉迷在围棋教学中一声声宝宝中
雪糕麻麻这么可爱,我肯定要狠狠的切片,想切片首先得有录播,其他人传的录播可能会存在几个问题令我不是很满意:

  1. 没有弹幕
  2. 有弹幕但是没有 sc
  3. 有 sc 但是显示效果不佳
  4. 快速切带有弹幕的片段

录播大致分为几种:

  1. 没有弹幕的,这种最为简单,随便找个录播软件都能处理。
  2. 有弹幕的,采用直接录屏,这种录出来的视频质量不会非常好,而且不容易进行自动化。
  3. 将弹幕和视频流分别进行处理,之后再将弹幕硬编码到视频中。

调研完就要根据需求寻找对应的工具了。

  1. 录屏工具,支持保存视频流和弹幕流
  2. 支持将 b 站 xml 弹幕流文件转换为通用 ass 文件的工具
  3. 在里面加点私货
  4. 硬编码工具

接下来就是各个流程以及工具的介绍了,不关注雪糕麻麻就不准你看下去了!!!

录屏工具

谷歌搜索 b 站录播 第一个选项
b 站录播工具我推荐 B 站录播姬 ,我试用下来完美符合我的第一个要求,还有 GUI 版本,舒服。
如果你想录制 sc,记得在设置里把相关的设置打开。

转换工具

转换工具我推荐使用 DanmakuFactory 支持转换 sc,以及支持 cli 调用,方便打造进一步的工作流。
这里我给出我的转换脚本,只要将弹幕文件拖动到 bat 文件即可进行自动转换。
将下载获取的cli文件重命名为DanmakuFactory.exe并加入环境变量。

这里我修改了弹幕的字体大小以及透明度,将以下代码保存成 bat 文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
@echo off
setlocal
echo %cd%
REM 获取文件的完整路径
set "FILE_PATH=%~1"

REM 获取文件的basename
for %%i in ("%FILE_PATH%") do set "BASENAME=%%~ni"

DanmakuFactory.exe -o "%BASENAME%.ass" -i "%FILE_PATH%" --showmsgbox true -S 30 -O 150

pause

endlocal

私货时间

说叫私货时间其实也没有那么私货,只是 DanmakuFactory 转换 sc 后生成的 ass 文件我不满意,出现后只有等其余 sc 将其顶出屏幕,期间会遮掉很大一部分屏幕,我写了一个脚本支持修改 sc 弹幕的持续时间,使其减少对内容的影响。
如果这个issue 做完可能就不需要我的脚本了

之后准备增加一些功能:

  1. 自动嵌入某条弹幕,比如大屏红字雪糕麻麻是我的
  2. 增加 sc 的出现消失的过渡效果

我们再修改一下自动化脚本,你需要下载对应平台的 cli 工具,并加到环境变量中

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
REM 将原始xml文件转换为ass
@echo off
setlocal
echo %cd%
REM 获取文件的完整路径
set "FILE_PATH=%~1"

REM 获取文件的basename
for %%i in ("%FILE_PATH%") do set "BASENAME=%%~ni"

DanmakuFactory.exe -o "%BASENAME%.ass" -i "%FILE_PATH%" --showmsgbox true -S 30 -O 150
ass-convert-win.exe -i "%BASENAME%.ass" -r

pause

endlocal

压制工具

万物视频压制大多基于ffmpeg,我们也是用这个工具来实现视频字幕的硬编码,一行就可以解决了
我们来一个一个参数解析一下这个命令我也是初学者
ffmpeg -i example.flv -vf "subtitles=example.ass" -c:v libx264 -c:a copy example.mp4

  1. 首先 -i example.flv 参数代表输入文件名称是example.flv-i 是指input
  2. 其次 -vf subtitles=example.ass 参数代表对视频进行处理,这里指得是加上了字幕文件
  3. 然后 -c:v libx264 是指定编码器使用libx264,这个编码器会使用 cpu 进行编码
  4. -c:a copy 是指音频流从原始文件中进行复制,不进行额外处理
  5. 最后是输出文件的名称

最后我们再来优化一下之前的脚本:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
@echo off
setlocal

REM 获取文件的完整路径
set "FILE_PATH=%~1"

REM 获取文件的basename
for %%i in ("%FILE_PATH%") do set "BASENAME=%%~ni"

DanmakuFactory.exe -o "%BASENAME%.ass" -i "%BASENAME%.xml" --ignore-warnings --showmsgbox true -S 30 -O 150
ass-convert-win.exe -i "%BASENAME%.ass" -r
ffmpeg -i %BASENAME%.flv -vf "subtitles=%BASENAME%.ass" -c:v libx264 -c:a copy %BASENAME%.mp4

pause

endlocal

现在我们的脚本已经可以做到将一个录播视频拖动到 bat 文件中,自动转换出 ass 文件以及压制后的视频文件。

增强

单纯使用 cpu 来进行重编码,效率会比较低下,以及影响到正常的录播功能,接下来我们尝试使用intel的核显来进行编码,效率会略有上升。
首先你的核显需要支持qsv功能,查看此页面进行检查
之后需要安装最新版的驱动,可以在 intel 的官网中搜索你的型号获取安装。
之后将ffmpeg这行代码修改为ffmpeg -i %BASENAME%.flv -vf "subtitles=%BASENAME%.ass" -c:v h264_qsv -c:a copy %BASENAME%.mp4 -y -hwaccel qsv

如果你有老黄的显卡,也可以使用 cuda 来进行加速,下次再折腾吧。

性能

cpu 编码
cpu编码

核显编码
intel核显编码

快速切带有弹幕的片段

先说一下什么叫做快速切带有弹幕的片段:
如果你采用视频流和弹幕分别保存的流程下,正常你想切某个带有弹幕的视频。
你可能需要先将弹幕硬编码到视频中再进行剪辑,或者剪切完后移动弹幕轴,或者在可以渲染 ass 字幕的播放器中进行录制。
以上的几种方式有显得稍微有些繁琐,大大打击切片的积极性。

我的方法没有那么繁琐的流程,只需要 3 步,而且只会在最后进行一次编码。

首先需要下载找个lossless-cut工具,之后所有的粗剪,以及切片相关的工作我都会使用这个工具来完成

先说一下完成这个事情的思路:

  1. 将转换后的 ass 和 mp4 文件封装成 mkv 格式
  2. 利用 lossless-cut 来进行剪辑
  3. 将剪辑后的 mkv 文件拆成 mp4 以及 ass 文件,再进行硬编码

第一步

将正在录制的文件复制到一个新的文件夹再做接下来的处理,以防录制出现问题,别问我怎么知道的
将转换后的 ass 和 mp4 文件封装成 mkv 格式。

这一步很简单,直接用 ffmpeg 进行处理就行,这里给出我的处理脚本:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
REM 将视频和ass字幕装到mkv容器中

@echo off
setlocal
echo %cd%
REM 获取文件的完整路径
set "FILE_PATH=%~1"

REM 获取文件的basename
for %%i in ("%FILE_PATH%") do set "BASENAME=%%~ni"

REM 如果ass文件存在,不用进行额外处理了
IF NOT EXIST %BASENAME%.ass (
DanmakuFactory.exe -o "%BASENAME%.ass" -i "%BASENAME%.xml" --showmsgbox true -S 30 -O 150
ass-convert-win.exe -i "%BASENAME%.ass" -r
)

ffmpeg -i %FILE_PATH% -i %BASENAME%.ass -map 0 -map 1 -c copy %BASENAME%.mkv

pause

endlocal

第二步

利用 lossless-cut 来进行剪辑。

安装完毕软件后,只要将视频拖动至软件图片上,即可打开进行处理。
需要在设置中关闭关键帧剪辑。

第三步

将剪辑后导出的 mkv 进行硬编码,这里我也给出我的处理脚本:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
REM 将带有字幕的mkv文件进行硬编码

@echo off
setlocal

REM 获取文件的完整路径
set "FILE_PATH=%~1"

for %%i in ("%FILE_PATH%") do set "BASENAME=%%~ni"

ffmpeg -i %FILE_PATH% -map 0:s:0 %BASENAME%_temp.ass
ffmpeg -i %FILE_PATH% -c copy %BASENAME%_temp.mp4
ffmpeg -i %BASENAME%_temp.mp4 -vf "subtitles=%BASENAME%_temp.ass" -c:v libx264 -c:a copy "%BASENAME%.mp4"

del %BASENAME%_temp.ass
del %BASENAME%_temp.mp4

pause

endlocal

做字幕

自动上传

待施工