大批量视音频压制,封装,自动.bat操作 2019.6更

NAZOrip@A
NAZOrip@A 4月28日
  • 在其它设备中阅读本文章

咳咳, 标题有点吓人, 说明白点就是套一堆变量进CMD去, 然后利用命令行按先后顺序运行的特性来完成一大批操作的操作...

2019.6版更新:在所有.bat文件中,第一行单独写上"chcp 65001",才能让cmd理解Unicode(UTF-8)文本的命令,否则会出现错误

这样做的好处是
1.既享受到了变量的方便, 又不需要往系统里设置%PATH%, 可以把所有的命令都存在一个.bat文件内, 放USB盘里, 插进别人的电脑压制以节省电费(噗)
2.可以让电脑自动完成远超过一般GUI软件能实现的操作
3.更好的利用多路处理器,一个处理器跑一个.bat
4.理论上改一下格式,命令和变量符号,改成.sh就可以在linux上使用(作者用linux没超过1000小时,所以没敢往标题上写Bash...)

缺点: 由于引号也会被记录到变量里, 所以不能再用引号来允许文件/目录名的空格

先看这个小例子:


::导入待处理的视音频:

@ set 音频1=D:\Audio\音频.mp3
@ set 视频1=E:\Video\视频1.mp4

::可以使用 "@ echo"命令来检查某个变量是否正确, 如"@ echo 音频参数: %音频参数%"

::设置压制/处理用程序路径:

@ set x264=D:\x264-8bit.exe
@ set qaac=E:\qaac\qaac64.exe
@ set ffmpeg=F:\ffmpeg\ffmpeg.exe

::最后, 设置参数. 此处参数的开头结尾不加空格是因为放在组装变量的步骤里了

@ set 视频参数=--me umh --merange 48 --subme 11 --no-fast-pskip --keyint 480 --min-keyint 300 --bframes 11 --b-adapt 2 --direct auto --scenecut 30 --ref 3 --crf 22 --qpmin 18 --rc-lookahead 120 --qcomp 0.37 --qpmin 18 --aq-mode 2 --aq-strength 0.31 --trellis 2  --no-psy --opencl
--deblock 2:0 --nr 10 --vf hqdn3d:1.1,1.1,1.1,1.1/resize:1280,720,,,,lanczos
@ set 音频参数=-a 320 -b 16 -r 44100 --threading

::组装变量,设置输出的视音频为新的变量,开始压制
::顺序是 "%路径%+%参数%+输出文件+%输入文件%"

%qaac% %音频参数% -o E:\新建文件夹\1.aac %音频1%
@ set 压好的音频1=E:\新建文件夹\1.aac
%x264% %视频参数% --output E:\新建文件夹\1.mp4 %视频1%
@ set 压好的视频1=E:\新建文件夹\1.mp4

::如果参数设置步骤设了空格,那么此处就不应写空格,但是观感较乱,如:

"%qaac%%音频参数%-o E:\新建文件夹\1.aac%音频1%"

::最后是封装

%ffmpeg% -i %压好的视频1% -c:v copy -i %压好的音频1% -c:a copy E:\新建文件夹\完成1.mp4

::额外加一个暂停, 防止CMD自动关闭, 看不到报错

pause

说明:

'@'的用途是不让CMD把其之后的内容重复一遍,精简画面
'%%'的用途是让CMD知道这是个变量,找出存入的内容并打出来
'::'的用途是让部分内容跳过CMD的分析, 从而加注解

以上例子可以用来自动压制并封装无限多个h.264格式的视频, 以及aac格式的音频. 用的时候直接改一下输入视频的路径即可,从而节省了时间

然后是扩展版:

@ set 720_30=--input-res 1280x720 --ctu 32 --fps 30
@ set 1080_25=--input-res 1920x1080 --ctu 64 --fps 25
@ set 音频1=D:\Audio\音频1.mp3
@ set 音频2=D:\Audio\音频2.mp3
@ set 音频3=D:\Audio\音频3.mp3

@ set 视频1=E:\Video\视频1.mp4
@ set 视频2=E:\Video\视频2.mp4
@ set 视频3=E:\Video\视频3.mp4

@ set 滤镜1=F:\Synth\滤镜1.vpy
@ set 滤镜2=F:\Synth\滤镜2.vpy
@ set 滤镜3=F:\Synth\滤镜3.vpy

::由于已经设定了input-res, ctu和fps, 所以不使用ffmpeg与VSpipe的yuv for mpeg来传递分辨率和帧率
::"|"的后面需要一个空格
@ set pipeA1=D:\ffmpeg.exe -i %视频1% -an -f rawvideo - | 
@ set pipeA2=D:\ffmpeg.exe -i %视频2% -an -f rawvideo - | 
@ set pipeA3=D:\ffmpeg.exe -i %视频3% -an -f rawvideo - | 

@ set pipeB1=D:\vspipe.exe %滤镜1% - | 
@ set pipeB2=D:\vspipe.exe %滤镜2% - | 
@ set pipeB3=D:\vspipe.exe %滤镜3% - | 

@ set 简单参数=--preset veryslow --tone film

::压音频, 设置变量以准备封装
D:\QAAC.exe -a 320 -b 16 -r 44100 --threading -o E:\音频1输出.aac E:\%音频1%
D:\QAAC.exe -a 320 -b 16 -r 44100 --threading -o E:\音频2输出.aac E:\%音频2%
D:\QAAC.exe -a 320 -b 16 -r 44100 --threading -o E:\音频3输出.aac E:\%音频3%
@ set 音频1out=E:\音频1输出.aac
@ set 音频2out=E:\音频2输出.aac
@ set 音频3out=E:\音频3输出.aac

::压视频, 设置变量以准备封装
::报错被独立写入一个文件
%pipeA1% D:\x265-8bit.exe %720_30% %简单参数% - --output E:\视频\A1.hevc 2>>E:\报错.txt
%pipeA2% D:\x265-8bit.exe %1080_25% %简单参数% - --output E:\视频\A2.hevc 2>>E:\报错.txt
%pipeA3% D:\x265-8bit.exe %1080_25% %简单参数% - --output E:\视频\A3.hevc 2>>E:\报错.txt
@ set 视频A1out=E:\视频\A1.hevc
@ set 视频A2out=E:\视频\A2.hevc
@ set 视频A3out=E:\视频\A3.hevc

%pipeB1% D:\x265-8bit.exe %720_30% %简单参数% - --output E:\视频\B1.hevc 2>>E:\报错.txt
%pipeB2% D:\x265-8bit.exe %1080_25% %简单参数% - --output E:\视频\B2.hevc 2>>E:\报错.txt
%pipeB3% D:\x265-8bit.exe %1080_25% %简单参数% - --output E:\视频\B3.hevc 2>>E:\报错.txt
@ set 视频B1out=E:\视频\B1.hevc
@ set 视频B2out=E:\视频\B2.hevc
@ set 视频B3out=E:\视频\B3.hevc

::封装
D:\ffmpeg.exe -i %视频A1out% -c:v copy -i %音频1out% -c:a copy E:\新建文件夹\完成A1.mp4
D:\ffmpeg.exe -i %视频A2out% -c:v copy -i %音频2out% -c:a copy E:\新建文件夹\完成A2.mp4
D:\ffmpeg.exe -i %视频A3out% -c:v copy -i %音频3out% -c:a copy E:\新建文件夹\完成A3.mp4

D:\ffmpeg.exe -i %视频B1out% -c:v copy -i %音频1out% -c:a copy E:\新建文件夹\完成B1.mp4
D:\ffmpeg.exe -i %视频B2out% -c:v copy -i %音频2out% -c:a copy E:\新建文件夹\完成B2.mp4
D:\ffmpeg.exe -i %视频B3out% -c:v copy -i %音频3out% -c:a copy E:\新建文件夹\完成B3.mp4
::删除源文件(CMD中会出现是否删除y/n的提示,而不是直接删. 所以如果前面哪个步骤出错后, 直接关闭CMD窗口即可)
del %音频1%
del %音频2%
del %音频3%
del %视频1%
del %视频2%
del %视频3%
del %滤镜1%
del %滤镜2%
del %滤镜3%
del %音频1out%
del %音频2out%
del %音频3out%
del %视频A1out%
del %视频A2out%
del %视频A3out%
del %视频B1out%
del %视频B2out%
del %视频B3out%

(!还是不能完全确定这个命令能不能正常运行...)


其它
x265搭配双路CPU,一次两个视频以达到最大速度,手动输入命令:

x265 [参数] --pools +,- & x265 [参数] --pools -,+

那么就这样...

    Snow
    Snow  2019-05-30, 20:26

    @ set 压好的视频1=E:\新建文件夹\1.aac 请把aac改成MP4

      NAZOrip@A
      NAZOrip@A  2019-06-10, 12:22

      搞定,感谢提醒