大批量视音频压制,封装,自动化Win/Linux操作 2020.3版

NAZOrip@A
[email protected] 2019年12月23日
  • 在其它设备中阅读本文章

咳咳, 标题有点吓人, 说明白点就是套一堆变量进命令行去, 然后完成一大批操作的操作...

这样做的好处是
1.既享受到了变量的方便, 又不需要往系统里设置%PATH%, 可以把所有的命令都存在一个命令文件(bat, cmd, ps1, sh等)内, 放USB盘里, 偷偷拿别人的电脑压制以节省电费(误)
2.相比用软件完成,这样做可以解锁所有编码器,滤镜,操作系统控制(完成关机/睡眠,但失败不关机等)等设置
3.改改格式就能做到多平台兼容(作者用linux没超过1000小时,基础很差)

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


给出bat/cmd/ps1所在目录下,所有完整pdf路径+文件名

chcp 65001
@ for %%a in (*.pdf) do echo "%~dp0%%a"

!注意,括号内不能用引号,有的编码器(如QAAC)不支持单引号所以全部改用双引号!
chcp 65001--------启用unicode命令行
@-----------------------屏蔽cmd回应命令,因为本来已经会给出结果了;
%%a---------------------可变的变量%a(不用非得是%a,%0也行);
for %%a in ("*.pdf")---在for循环完成前,变量%%a将被赋值为*.pdf,引号是允许文件名空格
"%~dp0%%a"--------------将变量%0展开成当前盘符d,路径p。并附上变量%%a,最终得出完整路径+文件名


给出sh所在目录下,所有完整pdf路径+文件名(可能能用)

#!/bin/bash
for pdf in "/home/user/*.pdf"; do
    echo "$pdf"
done

Win设置参数。

注意在这里的参数前后加空格,后面放入命令行里就不能加空格了,会比较难看
@ 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 --qpmax 24 --aq-mode 3 --aq-strength 0.4 --trellis 2  --no-psy --opencl --no-fast-pskip --deblock 0:0 --nr 10 --vf hqdn3d:1.1,1.1,1.1,1.1
@ set 音频参数=-a 320 -b 16 -r 44100 --threading

Unix设置参数

视频参数=--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 --qpmax 24 --aq-mode 3 --aq-strength 0.4 --trellis 2  --no-psy --opencl --no-fast-pskip --deblock 0:0 --nr 10 --vf hqdn3d:1.1,1.1,1.1,1.1
音频参数=-a 320 -b 16 -r 44100 --threading

Win循环压制同文件夹下所有mkv,所有flac,输出文件名不变的mp4和aac

chcp 65001
@ for %%1 in (*.mkv) do (
    x265 %视频参数% --output "%%~n1.mp4" "%~dp0%%1"
    qaac %音频参数% -o "%%~n1.aac" "%~dp0%%~n1.flac"
)
pause

!注意,括号内不能用引号,有的编码器(如QAAC)不支持单引号所以全部改用双引号!
这个命令比之前多了%%~n1,目的是去掉文件后缀。举例:香蕉.jpg --> 香蕉
在输出视音频,以及导出音频的时候用%~n去掉了后缀,加上了别的后缀。香蕉.jpg --> "香蕉"+".png" = 香蕉.png
如果要导出到特定文件夹,直接用--output "D:文件夹%%~n1.mp4"就行了
pause让命令完成后不关闭窗口,能帮助看到报错

Unix循环压制视音频

#!/bin/bash
for 压制 in "/home/user/文件夹/*.mkv"; do
    x265 $视频参数 --output "${压制%.*}.mp4" "$压制"
    qaac $音频参数 --output "${压制%.*}.aac" "${压制%.*}.flac"
done
read -p "按Enter继续哦"

可能需要修改才能用,总之是不太懂,然后${FILE%.*}好像就是去文件后缀的方法吧...

Win循环封装视音频(另写一个bat/cmd/ps1,这里顺便在输出文件名前加了个"完成_")

chcp 65001
@ for %%1 in (*.mp4) do (ffmpeg -i "%%3" -c:v copy -i "%%~n1.aac" -c:a copy "完成_%%1.mp4")
pause

Unix循环封装视音频

#!/bin/bash
for 封装 in "/home/user/文件夹/*.mp4"; do
    ffmpeg -i "$封装" -c:v copy -i "${封装%.*}.aac" -c:a copy "完成_%%1.mp4" $视频参数 --output "完成_${封装%.*}.mp4" "$封装"
done
read -p "按Enter继续哦"

Win循环滤镜压制,导出视频(未测试)

chcp 65001
@ for %%1 in (*.vpy) do (VSpipe "%%1" --y4m - | x265 %视频参数% --output "%%~n1.mp4" "%~dp0%%1")
pause

Unix循环压制,导出视频(未测试)

#!/bin/bash
for 压制 in "/home/user/文件夹/*.vpy"; do
    VSpipe "$压制" --y4m - | x265 $视频参数 - --output "${压制%.*}.mp4" "$压制"
done
read -p "按Enter继续哦"

其它:

@的用途是不让CMD把其之后的内容重复一遍,精简画面
::是powershell, cmd的注释格式
#是bash的注释格式

Linux安装ffmpeg到系统变量

sudo add-apt-repository universe
sudo apt update
sudo apt install ffmpeg

Linux编译x264/x265/qaac等

不知道啊...

Win完成后清点文件,文件存在就睡眠,反之暂停(未测试)

if exist "F:\视频1.mp4" (
    if exist "F:\视频2.mp4" (
        %pass = '1' & echo "视频文件都找到了"
    ) else %pass = '' & echo "!视频2不存在"
) else %pass = '' & echo "!视频1不存在"

if %pass == '1' (echo "开始睡眠" & psshutdown -h -t 00) else (pause)

那么就这样...

    Snow
    Snow  2019-05-30, 20:26

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