0%

最近二压视频用的一键脚本

分解MKV+写一个对应的压制文件

简单讲压制过程:
原文件的标题都是"Yu-Gi-Oh! Zexal - 013 - The Number Hunter, Part 1.mkv"的格式。
压成0.49倍码率的mp4,重命名为"[Yu-Gi-Oh! ZEXAL][English][1080P][013] The Number Hunter, Part 1"的格式。

——以上的步骤,之前都是手动处理的,包括手动复制粘贴命令分解mkv…… 源文件也不方便乱动,总之很烦。
今晚搞了个一键分解.bat来做这些事。只要把源文件名粘贴进去就行了。

目前的问题:
取得源视频比特率的地方失败。
如果把其他没影响的内容都注释掉,只留定义num和这行,就能正常输出bit。
完全不知道是哪一步出了问题,难道是电脑存不下太多变量吗(……)


REM开头的是注释。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
@echo off
echo E:\源文件目录 的mkv文件分解
echo 请输入无后缀的原文件名(例:Yu-Gi-Oh! Zexal - 013 - The Number Hunter, Part 1)
set /p "full_name=请输入:"

REM 得到文件名full_name后,从里面提取编号和标题部分
REM 第19位开始,往后3位是编号,存入变量num;第25位开始,往后全是标题,存入变量title。
set "num=%full_name:~18,3%"
set "title=%full_name:~24%"

echo num=%num%
echo title=%title%
echo 请确保目录"E:\压制目录"存在,如不存在请修改保存路径。

REM 没问题的话按y继续。/i是忽略Y大小写的指令。
set /p "confirm=是否继续执行?(y/n)"

if /i "%confirm%"=="y" (
echo 开始分解...
cd /d E:\源文件目录

if exist "%full_name%.mkv" (
REM 提取字幕、音频、视频。
ffmpeg -i "%full_name%.mkv" -an -vn -scodec copy "E:\压制目录\%num%.srt"
ffmpeg -i "%full_name%.mkv" -vn -y -acodec copy "E:\压制目录\%num%_a.ac3"
ffmpeg -i "%full_name%.mkv" -vcodec copy -an "E:\压制目录\%num%_v_o.mp4"
echo 分解完成。

echo 开始制作压制命令文件...
cd /d E:\压制目录

REM 取得源视频比特率
for /f "tokens=2 delims== " %%a in ('ffprobe -v error -select_streams v:0 -show_entries stream^=bit_rate %num%_v_o.mp4 2^>^&1') do set "bit=%%a"
REM 这里我是除以1000让单位变成k,再乘0.49。最后结果四舍五入保留到百位。比如原本是10011k,压制要求就是4900k.
set /a "bit=bit*49/100000"
set /a "bit=(bit+50)/100*100"

REM 然后把压制用的命令写进一个bat文件里。
(
echo ffmpeg -i %num%_v_o.mp4 -b:v %bit%k -c:v libx264 -pass 1 -y -f mp4 NUL
echo ffmpeg -i %num%_v_o.mp4 -b:v %bit%k -c:v libx264 -pass 2 %num%_v.mp4
echo ffmpeg -i %num%_v.mp4 -i %num%_a.m4a -i %num%.srt -vcodec copy -acodec copy -c:s mov_text "[Yu-Gi-Oh! ZEXAL][English][1080P][%num%] %title%.mp4"
echo del ffmpeg2pass-0.log.mbtree
echo del ffmpeg2pass-0.log
) > %num%.bat

echo 完成!请用GoldWave将ac3文件转为m4a格式!
) else (
echo E:\源文件目录\%full_name%.mkv 文件不存在。
)
) else (
echo 操作已取消。
)
pause

运行之后,会生成字幕.srt、源视频.mp4、源音频.ac3,和一个包含压制命令的bat文件。
记得压制前要用GoldWave把音频ac3文件转为m4a。

因为压制蛮花时间的(以我的电脑配置),就没有一口气包含进来,慢慢攒着做了。

为什么不用ffmpeg转码音频:之前试过失败了,具体是为什么失败不记得了。
也想在一键脚本里直接调用GoldWave转码,好像付费版才有命令行工具……算了。
(懒)