CLI Apps & Tips (Windows)

来自Tsetien’s Wiki
跳到导航 跳到搜索

这个页面用于汇集整理适用于 Windows 的各种好用的命令行程序以及其常用命令。同时附带了系统自带命令的使用小贴士。

无论是系统自带命令还是需要下载安装的命令行程序,这里介绍的都只是其最简单最常用的方法,如需了解其详细介绍,最好的办法当然是在命令名后面输入空格以及 /? (适用于系统自带命令) 或 --help (适用于大部分另外安装的命令行程序) 来阅读详细的说明文档。说明文档一般都是高度浓缩的,仔细读两遍便可明白了。

需要写在前面的是——在任何时候,只要所涉及的文件名及其路径(若有)中有空格,则必须用笨双引号将整个文件名包括其路径(若有)引起来。

比如我们要把 D 盘 ‘ab cd’ 文件夹下的 ‘ef ghi.pdf’ 重命名为 ‘JKL.pdf’, 则应当使用:

ren "D:\ab cd\ef ghi.pdf" JKL.pdf

由于即使文件名或者路径中没有空格使用笨双引号将文件名(含路径)引起来也不会错,所以其实也可以直接记为:文件名(含路径)须用笨双引号引起来。

在绝大多数情况下,命令行命令就像一种没有变位变格的拉丁语——完全不讲求语序,也即 吃 苹果 削皮 冷藏 切片吃 切片 苹果 冷藏 削皮 是一样的。不过,如果出现 给 苹果 张三 这种情况,则不能写为 给 张三 苹果——因为这样就会导致命令被理解为「把张三给苹果」。但如果命令可以指定谁是与格谁是宾格,则也可以那么写—— 给 -d:张三 -a:苹果

一个撰写 Windows Batch 文件的重要而常被忽视的点是:‘%’ 要写成 %%.

命令行基本操作

cls

cls 是系统自带的清屏命令。用法很简单,输入 cls 然后敲回车,屏幕就被清空了。——这一般是过去的小朋友学习的第一个命令吧?

chcp

chcp 是系统自带的更换代码页的命令。新时代的人无需去了解什么叫「代码页」,以及为什么文字编码会被微软叫做「代码页」,只要知道 chcp 65001 是将命令行的文字编码换为 UTF-8 就行了。

dir

dir 是系统自带的列目录命令。使用 /b 则只输出文件名,使用 /s 则预设列出该目录下以及所有子目录(的子目录(的子目录……))下的文件。使用 /b/s 则只输出带有绝对路径的该目录下以及所有子目录(的子目录(的子目录……))下的所有文件的文件名。使用 > 可以将本应该在屏幕上输出的内容输出到一个指定的文件中,使用 >> 则是追加输出到某一个指定的文件中。举例如下:
dir *.jpg *.png /b > list.txt 即为将本目录下所有的 .jpg 以及 .png 格式的文件的文件名输出至 list.txt 文本文件中。
dir *.* /a/b/s >> list.txt 即为将当前目录以及当前目录的子目录(以及当前目录的子目录的子目录……)下的所有文件(包括隐藏文件)的含有绝对路径的文件名追加输出到 list.txt 的尾部。需要注意的是,由于用的是 *.*, 所以 list.txt 本身也会被列入。

cd, md, 和 rd

cd 是系统自带的切换目录(文件夹)的命令。要进入到某个文件夹(比如 a),则用 cd a, 要返回上一级,则用 cd .., 也就是说,.. 代表「上一级目录」。因此比方说,在 a 下面有子目录 b, b 下面有子目录 c; 与 a 同级的还有目录 d, d 下面还有子目录 e; 那么如果需要从 c 目录切换到 e 目录则有:cd ..\..\..\d\e.

特别地,如果单纯输入 cd 就敲回车,则会在屏幕上返回 (echo) 当前的目录路径。

需要注意的是,切换「盘符」/「磁碟分割」不用 cd 命令,而是直接输入。比如要去 D 盘,就输入 D: 然后敲回车即可。

md 是系统自带的建立目录(文件夹)的命令。md 除了可以建立单独的目录外,还可以建立一整条路径,比如 md a\b\c d\e "fg h\i" 即表示在当前目录下建立了 a, d, 和 ‘fg h’ 这三个子目录,而在 a 目录下又建立了 b 这个子目录,并且在 b 下面还建立了 c 这个子目录,在和 a 同级的 d 目录下建立了 e 这个子目录,在和 a, d 同级的 ‘fg h’ 下建立了 i 这个子目录。

rd 是系统自带的删除目录(文件夹)的命令。预设情况下,rd 只能删除空文件夹,而是用 rd /s 则可以删除非空文件夹,不过会有同意询问;使用 rd /s /q 则可以跳过同意询问直接删除非空文件夹。比如要删除文件夹 a, 则有: rd /s/q a. 而要删除上方 md 命令的讲解用例中的所有新建的目录,则有:rd a d "fg h" /s/q.

copy, move, del, 和 ren

copy 是系统自带的复制文件的命令。使用方法很简单:copy "源文件 (可带路径)" "目标路径", 需要注意的是,copy 命令不支持同时复制多个文件,也即类似 copy a.txt b.txt destination_folder 是非法的,不过,copy 支持使用简单的 wildcards——注意是简单的 wildcards. 如果想搞成像 Word 里那样的表达式,还是趁早别做打算了。但比方说 copy *.txt destination_folder 还是可行的。

还需要注意的是,copy 是复制文件而非文件夹的命令,因此,如果你想把目录 a 复制到 b 中去,那么你需要先 md b\a 然后再 copy a b\a 而非直接 copy a b——这样只会把 a 下的所有文件直接复制到 b 下,或者如果你不先创建好 b 下的 acopy a b\a, 那更是灾难性的,这样会把 a 下所有的文件合并到 b 下一个名为 a 的没有后缀名(附档名)的文件中去。

move 是系统自带的移动文件或目录的命令。使用方法简单:move "源文件(可带路径)或目录" "目标路径". move 的好处在于,可以移动文件夹了。因此 move a b 本身便会将整个 a 文件夹移动到 b 下面。但需要注意的是,如果你是想把 a 移动到 b 下的 c 这个子目录下面,则还是需要先建立 b\c 然后再 move a b\c, 不然的话,move 会将 a 移动到 b 下,并将 a 重命名为 c, 而不是在 b 下建立一个 c 再把 a 放进去。

del 是系统自带的删除文件的命令。如果应用于文件夹,则为删除文件夹内所有文件(而不删除文件夹本身或者其中的子文件夹)。比方说,现在有文件夹 a, 其中有子文件夹 b 和 c.txt, d.txt, e.txt; 而子文件夹 b 下面又有 f.txt, g.txt, h.txt. 如果用命令 del a /s/q 则会删除 a 下的 c.txt, d.txt, e.txt 和子文件夹 b 下的 f.txt, g.txt, 和 h.txt, 但就是不会删除文件夹 a 和子文件夹 b. 因此,del 命令最佳的适用情境还是删除文件,如果要直接删除某个文件夹,还是直接用 rd /s/q.

ren 是系统自带的重命名命令。其语法为:ren "原文件或文件夹名(可带路径)" "新的文件或文件夹名(不可带路径)". 需要注意的是,使用 ren 命令重命名文件的时候,新的文件名千万别漏了后缀名(附档名)。

path

path 是系统自带的调整 %PATH% 的命令,至于什么是 %PATH%, 请参见下方的环境变量小节。其用法有:

  • path -> 也即写完命令什么都不写就敲回车,就能获得当前已经写在 %PATH% 中的目录列表;
  • path %cd%;%path% 此条命令可将当前目录添加到 %PATH% 的最前端;
  • path ; 此条命令可清空 %PATH%(非常危险的行为,切勿尝试!!!)。

type

type 是系统自带的将文件内容显示出来的命令。比如假如有一个文本文件 a.txt, 则输入 type a.txt 并敲回车就会在屏幕上显示出 a.txt 的内容。

听起来似乎没什么用,但是,如果结合 >> 追加输出则会变得有用起来。比方说——

type b.txt >> a.txt
type c.txt >> a.txt
type d.txt >> a.txt
…

则会将 b, c, d … 等文本文件的内容追加到 a.txt 的尾部。

不过,这样合并的文件中间是没有换行的,也就是可能会导致上一个文件的结尾行与下一个文件的开头行写在一起。所以比较明智的做法是每一次 type 之前都加入一个 echo. >> a.txt, 也即写成:

echo. >> a.txt
type b.txt >> a.txt
echo. >> a.txt
type c.txt >> a.txt
echo. >> a.txt
type d.txt >> a.txt
…

(至于 echo 是什么命令就不用管了,只需要记着 echo. >> a.txt 可以为 a.txt 添加一个换行就可以了。)

现在,一个简单的情景应用已经浮现了——假如使用 Save Text to File 这个浏览器扩展保存了很多同类的文本段(比如某个特定网站上的),然后这些文本段需要统一进行脏数据清洗,则可以先使用 dir /b *.txt > list.t (在此之前或许还需要来一个 chcp 65001——以免命令行的文字编码不是 UTF-8 而文件名中又有「表外字」), 然后用比如 Notepad++ 打开这个 list.t 文件,将其中的文件名复制到 Excel 中的 B 列(假设从 B2 开始),在 C2 中输入 ="echo. >> all.txt", 双击 C2 的右下角自动填充,再在 D2 中输入 ="type "&char(34)&B2&char(34)&" >> all.txt", 双击 D2 的右下角自动填充,将 C 列和 D 列有内容的单元格选中,复制,粘贴回 Notepad++ 里的这个 list.t 文件中,按下 Ctrl + H 调出替换功能,将 \t 替换为 \r\n, 再在首行命令前面加入一行 chcp 65001 (以免命令行的文字编码并非 UTF-8 而文件名中又有「表外字」), 之后保存这个 list.t 文件,并将其重命名为比方说 ‘cat.bat’, 双击,静候片刻,同文件夹下的所有的 .txt 文档就都合并到 all.txt 中了。之后再怎么清洗 all.txt 便是另外的故事了。

系统自带命令行程序

bcdedit

bcdedit 是系统自带的启动菜单编辑器。

如需将预设的启动菜单改为比较古老的黑白模式(也即防止 Windows 10 预启动),则使用:
bcdedit /set {default} bootmenupolicy legacy

如需将当前系统设为预设启动系统,则使用:
bcdedit /default {current}

certutil

certutil 是系统自带的一个非常复杂的命令行工具,其本意是作用于一些证书相关的作业的,但这个命令的一些「副业」却广为人们所传颂。这里只略举两例。

  • 将任意文件加密为 Base64 编码的文本:
    certutil -encode 输入文件 输出文件
  • 将任意文件从 Base64 编码的加密文本中解密:
    certutil -decode 输入文件 输出文件
  • 计算并输出任意文件的哈希值(支持 MD2, MD4, MD5, SHA1, SHA256, SHA384, 和 SHA512):
    certutil -hashfile 输入文件 HASH_TYPE > 输出文件
    其中 HASH_TYPE 为需要计算的哈希值类型。

第一个的玩法有比如让这个命令把一张图片转化为 Base64 编码的文本,然后放入 HTML 中 <img src="data:image/png;base64, 把转换好的 Base64 编码文本全部复制到这里但不要包括首末行!" /> 就可以在网页上显示出图片了。

第二个的玩法通常见于一些人会给你分享用 Base64 编码的文段(以规避审查),这时候用 certutil decode 一下就能看到原文了。

第三个的玩法则常见于验证 MD5/SHA1 码。不过如果要经常做这件事,还是推荐使用微软的一个官方出品但并未系统内建的小程序——fciv.

将它下载、解压(也就是它所谓的「安装」)到一个目录下面,然后将解压得到的 fciv.exe 复制到 %SystemRoot%\system32\ 下(当然也可以添加 %PATH%, 不过对于 fciv 我觉得它的归宿本来就应该是 system32!),之后便可以简单地使用 fciv 文件名 来计算其 MD5 的值了(如果需要计算 SHA1 的值则用 fciv -sha1 文件名, 如果两者都要则换用 -both)。

cleanmgr

cleanmgr 是系统自带的磁盘清理工具。使用以下命令可以使其清理最多的垃圾(不过要在弹出的图形窗口中将所有的勾选框都勾选上!):
cmd /c cleanmgr /sageset:65535 & cleanmgr /sagerun:65535

lpksetup

lpksetup 是系统自带的语言包安装命令。对于 Visual Studio subscriber (formerly MSDN subscriber) 并且使用 Windows Server 系作业系统的用户来说,他们能够获得的一个福利就是可以直接下载到一个以 ‘mu_’ 开头的 ISO 文件,里面有所有可用的语言包。那么挂载上这个 ISO 就可以离线安装语言包了。

比方说,我将语言包 ISO 挂载到了 E:\, 然后我想安装 en-GB 语言的语言包,则有:
lpksetup /i en-GB /p E:\x64\langpacks

虽然也没有什么大不了的,但,任何一点可以避开那些令人作呕的 UWP 的方法在我看来都是极好的。

mklink

mklink 是系统自带的为文件夹创建 Junction 的命令。其语法为 mklink /j b a. 其中 b 为假路径,a 为真路径。

实践中常用来转移 Google Chrome 的预设 profile 文件,只消将 %AppData%\..\Local\Google\Chrome\User Data 下的所有内容剪切并粘贴到一处「你选择的新地方」下面,然后 mklink /j "%AppData%\..\Local\Google\Chrome\User Data" "你选择的新地方" 即可。

net (user)

这个命令习惯上被人称之为 net user, 然而实际上它只是 net. 而且在一定的场合并不跟着后面的 user. 但为了遵从习惯,在这里还是称其为 net user 吧。

net user 是系统自带的用以设置用户账户的命令。要使用该命令,首先要开启一个抬权了的命令行(也即以管理员身份开启的命令行)。net user 的玩法有很多,这里只介绍两个:

  • 开启系统内建的 Administrator 用户:
    net user administrator /active:yes
  • 新建一个用户,并赋予其管理员权限:
    net user 新的用户名 新用户的密码 /add
    net localgroup administrators 新的用户名 /add

对于 Windows 10 那令人反感的复杂的极具诱导性的新用户添加流程,使用 net user 来添加新的本地用户也不失为一种对抗的方法。

ping

ping 是系统自带的一个测试网络连通性的小工具。其用法是:ping 网址或 IP 地址; 可加入 -t N 来手动规定测试次数(预设为 4 次),比如如果写成 ping -t 33 某 IP 地址 则为对该 IP 地址进行 33 次 ping 测试。如果 -t 后面不带数字,则为一直 ping 下去,直到用户手动按 Ctrl + C 终止命令的运行为止。对,在命令行中,Ctrl + C 是终止命令运行的控制键,不是复制的捷径键——当然在 Windows 10 上,系统在这里进行了智慧判断,如果没有正在运行的命令而且有选中的文本,则为复制,如果有正在运行的命令则为终止命令运行。

ping 的结果也和其他的命令一样,可以通过 >>> 输出至文件。

ping 的结果辩读:如果一个网站的网址或其 IP 根本 ping 不通,也即总是一直返回 ‘Request timed out.’, 那就不要希望能够连上了;如果时而能连通,时而连不通,且 ‘time=’ 后面的值都很大,则说明连这个网站很费劲。(出现这样的情况时,很有可能既不是你电脑/网线/运营商的原因也不是人家网站的原因,试着上厕所 (WC) 就完了。)

DOS 系与 UNIX 系命令名对照简表
DOS 系命令 UNIX 系命令
cd cd
cd 直接回车 pwd
dir ls
copy cp
move 与 ren mv
md mkdir
del 与 rd rm
type cat
ping ping

ssh

ssh 本身并不是一个命令行程序,它是一种传输协议。只不过从 Windows 10 起,系统内建了 OpenSSH (-> 这个就是一个工具而非协议了), 并将其简单地叫为 ssh. 使用 ssh 一般是为了连接到你的网络上的某个 VPS 或者托管共享服务器。要连接到它们很简单,只需 ssh 用户名@服务地址(IP 或者网址都可以) 即可。输入这条命令敲回车后一般会提示你输入密码。因为这时候往往连接到的是一个 Linux 系统,因此在输入密码时不会有星号 (*) 提示。登录之后,由于有很大概率你连接到的是一个 Linux 系统,因此以上所有命令除了 cd 和 cls 之外统统作废。一个简单的对照表如右。恕不在本篇详细展开。

使用非系统自带命令行程序的准备事项

接下来的命令行程序便是非系统自带的了。那么在介绍它们之前,需要先说明一下一些准备事项。

环境变量 (%PATH%)

如果你从网路上下载了一个命令行程序,当你把它从压缩包里解压出来后,它通常是一个或几个可执行文件 (.exe), 有时还会带有一些 .dll 文件。那么要将这些文件放到哪里呢?其实放到哪里都可以。比如如果它们位于 D:\MyFiles\Downloads\newlydownloaded 下,那么我们每次使用这个程序的时候只消将它的文件名+路径写全就可以用了。

但这样显然不方便,我们希望能够像系统自带的命令一样,只写其文件名就可以运行。怎么办呢?很简单,将它所在的位置添加到「环境变量」中的 %PATH% 下。就比方说,我们还是把某个命令行程序解压缩到了 D:\MyFiles\Downloads\newlydownloaded 下,那么,只要把 D:\MyFiles\Downloads\newlydownloaded 添加到环境变量的 %PATH% 中,以后我们使用这个命令行程序的时候就可以「直呼其名」了。

不过,为了方便管理,我谨慎地推荐,把所有 CLI 程序都放到一个目录下,然后只把这个目录添加到 %PATH% 就行了。这样以后管理这些命令行程序或者更新它们的时候也方便。比方说,我们在 C:\ 下新建一个目录 _CLIs, 然后把所有的命令行程序都存放到这里,这样只消把 C:\_CLIs 添加到 %PATH% 中就行了。

如何把某处目录添加到 %PATH% 呢?很简单:Control Panel > User Accounts > User Accounts > Change my environment variables (在左边) 然后双击第一项 %PATH%, 把你想要加入的目录加进去就行了。

唉?上面不是有条命令也可以添加 %PATH% 吗?(见上

System32 文件夹

有没有可以不添加 %PATH% 的方法呢?也有。那就是,把你要用的命令行程序(连带它需要用到的 DLL 文件——如果它附带了的话)复制到 %SystemRoot%\system32 中去。放在 system32 文件夹中的可执行程序是不用添加 %PATH% 就可以「直呼其名」的。有的时候我更推荐这种方式——因为有些垃圾清理软件会「好心地」预设帮你清理你添加到 %PATH% 中的目录……这样一不小心就……得重新添加了。

.Net Framework

有一些命令行程序可能需要依赖 .Net Framework. 而且有的依赖的是 3.5/2.0 版本,有的则是依赖 4.0+ 版本。幸运的是,如果你使用 Windows 7 及以上版本的 Windows 系统,这些需求便都能够满足。截至 2021 年 1 月,微软尚未放弃让最新版本的 .Net Framework 支持 Windows 7. 再之后就不知道了。正常来讲,一个及时更新的 Windows 系统应该已经含带了最新版本的 .Net Framework (目前是 4.8), 并且 Windows 7 及以上版本的 Windows 可以在 Control Panel 中启用 3.5/2.0 版本。不过如果你的系统不正常,则可以参考微软的官方安装包下载页面来安装之:.Net Framework 3.5 (含 2.0), .Net Framework 4.8.

PyPI

还有一些好用的命令行程序是需要依赖 python 的。这就需要我们先去安装 python.

python 的安装包可以从 https://www.python.org/ftp/python/ 处获得。对于 Windows 7 的使用者,需要安装的是 3.8.x 版本的 python; 对于 Windows 10 的使用者,则可以安装最新版本的 python.

安装时,切记要勾选上 ‘Add Python 3.x to %PATH%’.

这样,安装完了之后,我们就可以在命令行中直接用 pip 或 pip3 命令来直接安装需要使用 python 的命令行程序了。

pysocks

在使用 pip 或 pip3 安装一些依赖 python 的命令行程序的时候,常常会遇到包太大下载太费时甚至直接就超时的情形,因此需要让 pip 命令支持使用 proxy. 所以我们需要先用 pip install pysocks 来安装 pysocks 这个小工具。

之后再用 pip 或 pip3 安装包的时候,就可以在命令后面缀上 --proxy socks5:xxx.xxx.xxx.xxx:xxxxx 来使用指定的 proxy 以加速下载了,其中 xxx.xxx.xxx.xxx:xxxxx 为你的 socks5 proxy 的地址,按照「IP:Port」的形式撰写。

FFmpeg

最后,还有一些好用的命令行程序需要依赖 FFmpeg——尽管这货本身也是一个纯粹且强大的命令行程序。

FFmpeg 可由 官方推荐的这个第三方构建 处下载(要下载这个页面上的类似于 ‘ffmpeg-N-100791-ga2a06029cf-win64-gpl.zip’ 或类似于 ‘ffmpeg-n4.3.1-29-g89daac5fe2-win64-gpl-4.3.zip’ 的压缩包——前者为「每日构建」版本,后者为稳定版,但都是每天构建一次的,所以文件名天天变);下载好后解压,然后把 ‘bin’ 文件夹内的三个可执行文件放到本地的一个稳妥位置并将其所在的目录加入 %PATH% 就好了(或者也可以直接放入 System32 文件夹——任何时候这两种做法都是等效的)。

有关 FFmpeg 本身的常见用法请参见下方

压缩解压

使用命令行版的压缩解压程序的主要目的便在于撰写批次档(批处理文件)来批量化作业。毕竟压缩一个压缩包需要不少时间——尤其在比较老旧的机型上更是如此。因此,如果使用 Batch 文件的方式来让电脑自动一一压缩不同的压缩包,那么人便可以去一边睡大觉了。

WinRAR

下载地址:https://www.rarlab.com/download.htm
需要注意的是,即使你的母语是简化字中文,也不要下载 Simplified Chinese 语言版本,因为有且只有这个版本的 WinRAR 官方带广告,而且就算你购买了正版授权也去不掉。因此建议母语为简化字中文的用户使用英文版。

安装方式:安装式 (GUI 附带 CLI);可在完成安装后添加 %PATH%: %SystemRoot%\..\Program Files\WinRAR 或将 %SystemRoot%\..\Program Files\WinRAR 下的 Rar.exe 复制到一个已经添加到 %PATH% 中的目录下。

常见用法:

  • rar a -m5 -s -md512m -r 压缩包名.rar @文件列表.txt
    即为将「文件列表.txt」内所列出的文件以 Best 压缩等级、512 MB 的字典压缩到名唤「压缩包名.rar」的压缩包中。需要注意的是,Rar 压缩出来的压缩包是带目录层级的,这与 7z 不一样。
  • rar a -m5 -s -md512m -r 压缩包名.rar *.*
    即为将当前目录下的所有文件(含子目录以及子目录下的所有文件)以 Best 压缩等级、512 MB 的字典压缩到名唤「压缩包名.rar」的压缩包中。

如需加密,则加上 -hp123WSX 部分,其中 ‘123WSX’ 为你为压缩包所选择的密码。

7-Zip

下载地址:https://www.7-zip.org/download.html

安装方式:安装式 (GUI 附带 CLI);可在完成安装后添加 %PATH%: %SystemRoot%\..\Program Files\7-Zip 或将 %SystemRoot%\..\Program Files\7-Zip 下的 7z.dll 与 7z.exe 复制到一个已经添加到 %PATH% 中的目录下。

常见用法:

  • 7z a -t7z -mx=9 -aoa -mfb=256 -md=256m 压缩包名.7z @文件列表.txt
    即为将「文件列表.txt」内所列出的文件以 Ultra 压缩等级、256 MB 的字典、256 的 Word size 压缩到名唤「压缩包名.7z」的压缩包中。需要注意的是,这样压缩出来的压缩包是不带目录层级的,也即,如果「文件列表.txt」中是有比如 a\b\c.txt, a\d.txt, e.txt 这样的层级的话,则压缩后得到的压缩包里只有 c.txt, d.txt, 和 e.txt 这三个文件。而且在这种情境下无法通过使用 -r 来使其带有目录层级。
  • 7z a -t7z -mx=9 -aoa -mfb=256 -md=256m -r 压缩包名.7z *.*
    即为将当前目录下的所有文件(含子目录以及子目录下的所有文件)以 Ultra 压缩等级、256 MB 的字典、256 的 Word size 压缩到名唤「压缩包名.7z」的压缩包中。需要注意的是,这次压缩出来的压缩包就带目录层级了。

如需加密,则加上 -mhe -p123WSX 部分,其中 ‘123WSX’ 为你为压缩包所选择的密码。

uharc

下载地址:https://www.sac.sk/download/pack/uharc06b.zip

安装方式:解压式,将解压出来的所有可执行文件直接复制到一个已经添加到 %PATH% 中的目录下(别忘了最好是统一管理的一个目录,或者嫌麻烦直接统统扔 System32 也行)。

常见用法:

  • uharc a -m3 -md32768 -r -pr -ed 压缩包名.uha *.* (或者 @文件列表.txt)
    即为将当前目录下的所有文件(含子目录以及子目录下的所有文件)或者是将「文件列表.txt」内所列出的文件以 uharc 能提供的最好的压缩率压缩到名唤「压缩包名.uha」的压缩包中。需要注意的是,这样压缩出来的压缩包是带目录层级的。

需要特别注明的是:uharc 并不支持在 65001 代码页下压缩文件名中含有任何非当前系统 Locale 所对应之代码页的表外字的文件,也就是说你切换代码表也没有用。

这句话听起来非常绕,简单的理解方式就是:请确保要压缩的文件及文件夹的名称全部都使用基本拉丁字符组成

如需加密,则加上 -ph+ -pw 部分(在压缩包名和文件列表前),然后在程序的提示下输入密码两次以加密。

由于 uharc 压缩出来的压缩包并不能够被任何其他的压缩解压软件解压缩,因此要解压 .uha 文件,也需要 uharc 命令来执行,不过很简单,只需 uharc x 压缩包名.uha 就可以了。如果有密码,则加上 -pw123WSX 部分在要解压的文件名前,其中 ‘123WSX’ 为压缩包的密码。

uharc 在使用上的限制还有很多,比如不能压缩总体积大于 2 GB 的文件。但这不妨碍它是一个很好的压缩软件——尤其是,用 uharc 压缩过的压缩包很多云服务提供商都不能窥探其中的内容。因此,如果我想要通过 Gmail 发送一些 JavaScript 脚本给收信人的话,便可以考虑使用 uharc 来打包,这样 Gmail 就不会发现它是 .js 文件,也就不会有讨厌的「因安全原因不能发送」的警告了。

网络视频(流媒体)下载

youtube-dl

下载地址:https://github.com/ytdl-org/youtube-dl/releases/latest (不推荐直接下载可执行文件的方式)

安装方式:pip install youtube_dl (注意用 pip 安装的时候其包名为 youtube_dl 而非使用时的命令名 youtube-dl) 或从上方的下载地址处下载官方编译好的 .exe 文件并放入已经加入到 %PATH% 的目录下(并不推荐下载 .exe 的方法)。

更新:由于 youtube-dl 频繁更新,所以需要随时检查有无新版本——这就体现出了使用 pip 安装的方便了——要检查有无新版本,只需时不时 pip install --upgrade youtube_dl, 如有则自动下载安装之,如无则返回已是最新版的消息。而如果使用手动下载 .exe 的方式,则需要隔三差五地自行前往检查更新并手动再次下载、更新。

youtube-dl 可用于从 YouTube 以及少数的其他几个网站(986 个)上下载视频。

常见用法:

  • youtube-dl "网址"
    是最简单的用法,将需要下载的网址填入然后敲回车。
  • youtube-dl "网址" -x -k --embed-thumbnail --add-metadata
    这条命令表示:从"网址"处下载视频,并在下载完成后提取其音频轨单独另存一份 (-x) 但依旧保留其视频 (-k), 并尝试将视频的 thumbnail 嵌入到拽取出来的音频轨中 (--embed-thumbnail), 同时尝试以视频页面上能够获得的信息为音频轨添加曲目信息 (--add-metadata).
  • youtube-dl --proxy socks5://xxx.xxx.xxx.xxx:xxxxx/ --write-thumbnail --write-sub -o "[%(id)s] %(title)s.%(ext)s" "网址" -f "bestvideo[height<=?1080]+bestaudio/best"
    这条命令表示:从"网址"处下载视频,下载时选择下载不超过 1080p 的最好画质的音/视频 (-f "bestvideo[height<=?1080]+bestaudio/best"), 并在下载时使用 socks5://xxx.xxx.xxx.xxx:xxxxx/ 作为 proxy 地址 (--proxy socks5://xxx.xxx.xxx.xxx:xxxxx/), 下载视频的同时保存视频的 thumbnail 到本地 (--write-thumbnail), 保存视频的字幕到本地 (--write-sub, 如果需要保存 YouTube 自动生成的字幕则写:--write-auto-sub); 下载好后的视频以「[视频在网站上的 ID] 视频标题.后缀」的形式重命名 (-o "[%(id)s] %(title)s.%(ext)s").

当然,如果每次都这么写自然很麻烦,因此可以将常用配置写到一个配置文件中。方法是:

  1. 在资源管理器中前往 %AppData% 目录,在这下面创建一个新的文件夹,取名为 ‘youtube-dl’;
  2. 在新建的 ‘youtube-dl’ 文件夹下新建一个 .txt 文件,取名为 ‘config.txt’;
  3. 编辑这个 ‘config.txt’, 将你常用的配置写进去。

这样写好后,以后每次使用 youtube-dl 时,这些 ‘config.txt’ 中的设置就是你的预设设置。但这不耽误你使用与自定义预设配置相冲突的新配置——只要写在当条命令中就行了。

比方说,假如你已经在配置文件中指定了,但凡使用 youtube-dl 下载的视频,其保存路径和命名规则均为 -o "D:\Omnigena\_DownloadedYouTubeVideos\[%(id)s] %(title)s.%(ext)s", 但如今你想一气儿下载一个 YouTube 播放列表的所有视频,因此希望保存路径和命名规则变为 -o "D:\Omnigena\_DownloadedYouTubeVideos\%(playlist)s\%(playlist_index)s %(title)s (%(id)s).%(ext)s" (即表示保存到 D:\Omnigena\_DownloadedYouTubeVideos 下,以播放列表的名称新建一个文件夹,然后将所有视频放到这个文件夹中,并以 编号 视频名称 (视频 ID).后缀 的形式来命名文件名), 那么你需要做的就是把你的这个新的保存路径及命名规则写入你下载这个播放列表的命令里就可以了,不用先跑去删除 ‘config.txt’ 中的 -o 那一行,因为 youtube-dl 会自动临时 override 它,并在你不再在命令里指定 -o 时自动回到你写在 ‘config.txt’ 中的设置。

有些网站上的视频在使用 youtube-dl 下载时可能需要调用你在该网站的「已登录」状态,这可以通过为 youtube-dl 提供你的浏览器的 cookies 来解决,也即在命令中加入 --cookies "你浏览器的 cookies 存储文件"。对于 Firefox 用户,cookies 存储在你的 profile 文件夹下,是一个名叫 ‘cookies.sqlite’ 的文件。如果不知道你的 profile 文件夹在哪里,则在浏览器地址栏中输入 about:profiles 然后敲回车,找到 Root Directory 一栏,后面那个就是。比如假如我的 Firefox profile 文件夹是 D:\_MyFxpf, 那么要为 youtube-dl 引入 cookies 则写成 --cookies "D:\_MyFxpf\cookies.sqlite" 即可。例:

#Downloading Videos
--proxy "socks5://127.0.0.1:xxxx"
-o "D:/_DownloadedVideos/%(upload_date)s - %(title)s (%(id)s).%(ext)s"
-f bestvideo[height<=?2050]+bestaudio/best
--write-sub
--write-auto-sub
--cookies "D:\_MyFxpf\cookies.sqlite"
#Downloading Audios
--proxy "socks5://127.0.0.1:xxxx"
-o "D:/_DownloadedAudios/%(upload_date)s - %(title)s (%(id)s).%(ext)s"
-f bestaudio/best
--extract-audio
--add-metadata
--embed-thumbnail
--audio-quality 320K
--audio-format m4a
--cookies "D:\_MyFxpf\cookies.sqlite"
#Downloading Videos and Keep a Separate Audio Track
--proxy "socks5://127.0.0.1:xxxx"
-o "D:/_DownloadedVideos/%(upload_date)s - %(title)s (%(id)s).%(ext)s"
-f bestvideo[height<=?2050]+bestaudio/best
-x
--add-metadata
--embed-thumbnail
--audio-quality 320K
--audio-format m4a
-k
--write-sub
--write-auto-sub
--cookies "D:\_MyFxpf\cookies.sqlite"

对于 Chrome 用户,解决这一问题的方法是——安装并使用 Firefox 浏览器登录你那个网站的账户,然后把 --cookies 指向你的 Firefox 浏览器的 cookies 存储文件。

如果经常遇到需要调用 cookies 的情况,那别忘了直接把 --cookies "你浏览器的 cookies 存储文件" 扔到 %AppData%\youtube-dl\config.txt 中去。

当然 youtube-dl 的玩法还有很多,更多玩法请参见其官方 GitHub 页面上的说明。有些 Greasy Fork 脚本比如 BBC iPlayer video download 还会帮你生成 youtube-dl 命令,这样只需复制脚本在网页上给出的命令就可以下载对应的视频或字幕了。

you-get

下载地址:无法下载,须使用 pip3 来安装。(GitHub 项目地址:https://github.com/soimort/you-get/)

安装方式:pip3 install you-get (注意这里要写 pip3 而非 pip)

更新:pip3 install --upgrade you-get

you-get 的功能和 youtube-dl 差不多,只是支持的网站比较偏中国大陆一些,或者说,它提供了对 MTV81, Magisto, Heavy Music Archive, AliveThai, interest.me, 7gogo, AcFun, 百度贴吧、爆米花网、豆瓣、凤凰视频、风行网、激动网、酷狗音乐、荔枝 FM, 懒人听书、MissEvan, 痞客邦、PPTV 聚力、齐鲁网、QQ, 企鹅直播、土豆 (Tudou), 阳光卫视、战旗 TV, 央视网、火猫 TV, 阳光宽频网、西瓜视频、新片场、快手、抖音、“中国”体育 (TV), 和知乎的支持,而这些是不在 youtube-dl 的支持网站列表里的。——当然这并不是说 you-get 支持的网站就比 youtube-dl 多,因为如果反过来列举 youtube-dl 支持而 you-get 不支持的网站的话,可能就要列上 930 多个了。

因此,这里推荐将 you-get 作为 youtube-dl 的补充工具去使用。

常见用法:

  • you-get "网址"
    和 youtube-dl 一样,you-get 的最简单的用法也是直接挂网址,这样剩下的一切均是预设设置。
  • you-get -i "网址"
    这条命令用于列出 "网址" 这个网页上的所有支持使用 you-get 下载的内容的信息及标签。如果你需要下载的不是 you-get 认为的首选下载项,那就需要先用这条命令来查看都有哪些可选的下载项,然后再用 you-get --itag=xxx "网址" 来下载对应的内容。
  • you-get "网址" -l -o "下载到的位置" -c "你浏览器的 cookies 存储文件" --no-caption
    这条命令表示下载整个播放列表 (-l), 把视频下载到「下载到的位置」中 (-o "下载到的位置"), 使用浏览器的 cookies 文件 (-c "你浏览器的 cookies 存储文件"), 以及不要下载字幕或者「弹幕」 (--no-caption). 也就是说,you-get 的下载逻辑和 youtube-dl 不一样的地方在于——它是预设下载字幕或者「弹幕」的——预设下载字幕倒是好事,但「弹幕」?!所以在不得不下载某些网站的视频的时候,我都是全程 --no-caption 的。

此外,you-get 也支持使用 proxy. 它的常用的两个 proxy 设置选项是 -s-x. -s 是 socks5 的 proxy; -x 则是 HTTP 的 proxy. 两者的地址撰写形式都是直接的「IP:Port」式(也即写成 -s xxx.xxx.xxx.xxx:xxxxx-x xxx.xxx.xxx.xxx:xxxxx 样)。比较有意思的是,我以前从来不知道 socks5 的 proxy 要用 -s, 因此一直在用 -x, 但似乎……依旧可行。

svtplay-dl

下载地址:https://svtplay-dl.se/archive/

安装方式:解压式。将下载得到的压缩包内的所有文件(也即一个名为 ‘lib’ 的文件夹、一个名为 ‘svtplay-dl.exe’ 的可执行文件以及几个 .dll 文件)全部解压到某处已经加入到 %PATH% 的目录下。

更新:手动前往上方的下载地址处检查是否有新版本并手动更新之。

svtplay-dl 最初是用来下载 svt 网站上的视频的命令行工具。后来又扩展支持了一些别的网站,但基本上都是以瑞典(或者进而扩展到北欧)的视频网站为主。因此如果你不看瑞典剧(或者北欧剧)的话就可以跳过此节了。

常见用法:

  • svtplay-dl --proxy socks5://xxx.xxx.xxx.xxx:xxxxx/ "网址" -S
    这条命令即为使用 socks5://xxx.xxx.xxx.xxx:xxxxx/ 作为 proxy 来下载 "网址" 上的视频并同时下载字幕。需要注意的是,这里的 -S 必须大写,因为 -s 有不同的意思。svtplay-dl 所支持的那些网站有的可能会对你所在的 IP 有所挑选。如果你能让那些网站认为你是在瑞典,那自然是最好的,如果不能,试试看能否让它认为你在欧盟或者更次之,美国。我自己就遇到过使用美国的 IP 下载某个视频报错但身在瑞典的人帮忙测验没错的情况。

另外两个比较有用的设置是 -A--all-last N. 前者是让 svtplay-dl 尝试下载整个 series 全集的意思,后者是让 svtplay-dl 尝试下载这个 series 里「最后(最新) N 集」的意思,N 需要自己填入。注意我在这里的说法——「让 svtplay-dl 尝试下载」,也就是说,有可能尝试失败,那就还得乖乖地自己一集集地下。

中国大陆网络服务相关

ncmdump

下载地址:https://github.com/yoki123/ncmdump/releases/latest

安装方式:解压式。将唯一的可执行文件解压缩后放入已加入到 %PATH% 的目录下即可。建议将可执行文件改名为较短的名字(比如改为 ‘ncmdump.exe’)——因为这样方便在命令行里输入。以下默认已经改名为 ‘ncmdump.exe’ 了。

更新:手动检查上方的下载页面并通过手动下载新版(若有)的方式来更新。

ncmdump 用于解密从网易云音乐上下载下来的被加密的 .ncm 格式的音乐文件。

用法:

  • ncmdump "文件名.后缀名" -> 解密单首歌曲;
  • ncmdump "目录" -> 解密 "目录" 下的所有 .ncm 文件;
  • 特别的: ncmdump . -> 解密当前目录下所有 .ncm 文件。

qmcdump

下载地址:https://github.com/NoColor2/qmcdump-windows/blob/master/qmcdump.exe

安装方式:直接将这个可执行文件复制到一个已经加入到 %PATH% 中的目录下即可。

更新:应该没有更新了。其实它的这个构建是基于 MegrezZhu / qmcdump 这个项目的,这个项目一直在更新,然而这个项目官方不给编译。我这老电脑目前还是不折腾 VS 了。

qmcdump 用于解密从 QQ 音乐上下载下来的被加密的 .qmcflac, .qmc0, 或 .qmc3 格式的音乐文件。

用法:

  • qmcdump "文件名.后缀名"
    这个版本的还不支持文件夹玩法,因此只能一个一个来。貌似对非拉丁字母文件名也不友好,因此或许还需要在转换前先把文件名改一下。
music-dl 的交互模式示例(运行于 Windows 7 的 cmd.exe 下)

music-dl

下载地址:无法下载,须使用 pip 来安装。(GitHub 项目地址:https://github.com/0xHJK/music-dl)

安装方式:pip install pymusic-dl(部分依赖的包较大,建议上 proxy)

更新:pip install --upgrade pymusic-dl, 不过 music-dl 更新得不频繁,甚至我怀疑开发者的兴趣已经丧失了。

music-dl 是一个可用来从多个中国大陆常见音乐平台搜索音乐并下载的命令行小工具。不过下载的音质基本上都是 128 Kbps 的「试听音质」,若想下到 flac 估计还是得乖乖装那些该死的客户端。

用法:

  • 该命令行程序提供了交互模式,因此可以直接简单地使用 music-dl 来进入交互模式,并按照提示去作业。

BaiduPCS-Go

下载地址:https://github.com/qjfoidnh/BaiduPCS-Go/releases/latest

安装方式:解压式。将得到的可执行文件放入已加入到 %PATH% 的目录下即可。

更新:手动检查上方的下载页面。

BaiduPCS-Go 是百度网盘的命令行版客户端(非官方的——废话)。

用法:
获取百度云 Cookies 的方法
  • 初次使用时登录账号略微有点麻烦,但好在登录一次后很长一段时间内都无需再登录(除非你要切换账号从而人工登出了当前的账号)——
  1. 输入 baidupcs-go 敲回车进入交互界面;
  2. 打开浏览器,访问 https://pan.baidu.com 并登录你的百度网盘账户;
  3. 登录成功后,按下 F12 键,在弹出的我也不知道叫什么的这个面板上找到 ‘Storage’ 标签,点击去,看到左边这时候应该已经默认在 Cookies 下了,看到右边列出来了几个 Name 和 Value 等等,首先点一下 ‘BDUSS’, 看到右边弹出了一个 Data 详情边栏,在边栏里数据的第一行上按一下滑鼠辅键,点选「复制」(如无意外应是唯一的按钮);
  4. 打开一个纯文本编辑器(比如 Notepad++),将内容粘贴至其中;
  5. 返回浏览器,再在中间的 Name 和 Value 的列表中找到 ‘STOKEN’, 点一下,然后像刚才一样,在右侧的数据的第一行上按一下滑鼠辅键,点选复制并将复制所得内容放到纯文本编辑器中(取得这两个值的浏览器操作的关键步骤截图见右方);
  6. 回到纯文本编辑器,另起一空行,写下 login -bduss= -stoken=, 然后分别把刚才复制过来的 BDUSS 的(只要笨引号内的部分,笨引号本身不要)和 STOKEN 的复制并粘贴到 -bduss=-stoken= 后面(这一步不要偷懒,不要想着把上面的 BDUSS:"XXX" 和 STOKEN:"XXX" 改一改,以为改成 login -BDUSS=XXX -STOKEN=XXX 就行——实际上不行,因为 BaiduPCS-GO 竟然在这里要求 ‘-bduss’ 和 ‘-stoken’ 必须小写);
  7. 复制已经填好的 login -bduss=XXXXXXXXXX -stoken=XXXXXXXXXX 这一整行,然后返回命令行界面,粘贴,敲回车;
  8. 事情就这样成了。
  • 由于该命令行程序提供了交互模式,因此用起来会很简单。唯在进行文件操作时其所选用的命令名体系是 Linux 式的,因此需要参考上方的这个对照表
  • 下载文件的时候切记不要忘了指定输出目录,不然它会给你下到一个很奇怪的地方。

音频处理

flac

下载地址:https://www.rarewares.org/lossless.php#flac-bundle-x64

安装方式:解压式。

更新:手动检查。不过也不用检查太频繁,这种软件都是年更型的,甚至数年一更。

flac 为无损 (Lossless) 的音频编码格式。所谓「无损」,是指一个 RAW 的 WAV 文件压码为 flac 再从 flac 解码后与原文件丝毫不差。如今有很多音乐服务都提供 FLAC 格式的音乐下载。如需将 FLAC 转换成其他格式,则首先需要将其解码还原为 WAV. 如果有 WAV 格式的音频想要节省空间但无损地储存,则可压码为 FLAC. 如今大部分的音乐播放器都支持播放 FLAC 文件。

常见用法:

  • flac -d "文件名.flac" -o "解码后的 RAW WAV 文件名.wav"
    ↳将 .flac 文件解码,复原为 RAW WAV.
  • flac "文件名.wav" -o "文件名.flac" --tag=title="曲名" --tag=album="专辑名" --tag=artist="单曲艺术家" --tag="album artist"="专辑艺术家" --tag=composer="作曲" --tag=genre="曲风" --tag=year=年 --tag=track=轨号 --tag=totaltracks=总轨数 --tag=discnumber=碟号 --tag=totaldiscs=总碟数 --picture="专辑封面.jpg"
    ↳将 "文件名.wav" 压码成 "文件名.flac",并为其添加曲目信息及封面。

Nero AAC Codec

下载地址:https://www.rarewares.org/rrw/neroaac.php

安装方式:解压式。从上方下载下来 1.5.4 版本的压缩包后,将其中 ‘win32’ 子文件夹下的 3 个可执行文件解压缩到一处已经加入到 %PATH% 的目录下。

建议将三个可执行文件改名:

  1. neroAacDec.exe -> aacd.exe;
  2. neroAacEnc.exe -> aace.exe;
  3. neroAacTag.exe -> aact.exe.

以下皆默认已做上述改名操作。

更新:不用检查了,这个软件不会再更新了。

Nero AAC Codec 是由 Nero 出品的一套 AAC 编码的解决方案。AAC (Advanced Audio Codec) 是一种有损的 (Lossy) 音频编码格式。所谓「有损」,即指在使用这种方式将音频从 RAW WAV 进行压码时,并非所有的细节都能够得以保留,压码后若再将其解码,其所得结果与原始文件相比会有不可逆的细节缺失。但这并不意味着 AAC 就是一种不好的音频编码。因为被「损」掉的部分一般来说也是正常人无法察觉的部分(经双盲实验证明过的)。因此使用 AAC 编码来压码音频并保存是一种十分推荐的行为。绝大多数的音乐播放器都支持播放 AAC 编码的音频。

常见用法:

  • aace -cbr 655360 -if "文件名.wav" -of "文件名.m4a"
    ↳以 Nero AAC 所支持的最大恒定码率(意味着最好的音质、最少的音质损伤)将 "文件名.wav" 编码为 AAC 格式的音频;
  • aace -br 655360 -2pass -if "文件名.wav" -of "文件名.m4a"
    ↳以 Nero AAC 所支持的最大浮动码率(浮动码率往往比恒定码率能够获得更小的文件大小)将 "文件名.wav" 编码为 AAC 格式的音频;
  • aact "文件名.m4a" -meta:title="曲名" -meta:album="专辑名" -meta:artist="单曲艺术家" -meta-user:"album artist"="专辑艺术家" -meta:composer="作曲" -meta:genre="曲风" -meta:year=年 -meta:track=轨号 -meta:totaltracks=总轨数 -meta:disc=碟号 -meta:totaldiscs=总碟数 -add-cover:front:"专辑封面.jpg"
    ↳为 "文件名.m4a" 添加曲目信息及封面;
  • aacd -if "文件名.m4a (或 文件名.aac)" -of "文件名.wav"
    ↳将 "文件名.m4a (或 文件名.aac)" 解码为 WAV 文件(以供压码成其他格式)。这一条其实很重要,因为如果要将 AAC 编码的音频文件转换为其他格式,则首先都要经过这一步先解码为 WAV.

需要注意的是,Nero AAC 的编码、解码和添加曲目信息这三项作业都分别有自己独立的命令行程序。

qaac

下载地址:https://github.com/nu774/qaac/releases/latest

安装方式:解压式。将 ‘x64’ 文件夹下的可执行文件和 .dll 文件解压出来并放到一个已经加入 %PATH% 的目录下。但此时还无法使用,详见下方说明。

更新:手动检查上方的下载地址,手动下载新版(若有)并重新放置文件以更新。

qaac 是另外一款 AAC 编码方案,它需要借用 Apple 的 AAC 编码器,也就意味着需要用到 iTunes (下载地址:https://www.apple.com/itunes/download/win64), 但是需要注意的是,如今最新版本的 iTunes 要求最低 Windows 10 作业系统,因此对于 Windows 7 用户还是建议使用上方的 Nero AAC Codec.

iTunes 安装完毕后,qaac 还需要把 iTunes 程序目录 (%SystemRoot%\..\Program Files\itunes) 下的 ‘CoreAudioToolbox.dll’ 复制一份放到与 qaac 自己的可执行文件同级的目录下方可使用。——这是 qaac 官方说明中所说的,也是之前的 qaac 版本确实必须做的——也就是,如果你能从别的途径搞到 ‘CoreAudioToolbox.dll’, 就可以不用装 iTunes. 但目前最新版本的 qaac 似乎改变了规则,变成了你必须装 iTunes, 而是否把 ‘CoreAudioToolbox.dll’ 复制到 qaac 所在的目录则无关紧要了。至于以后 qaac 会不会再次改变规则,那就看开发者本人的想法了。

如果一切搞定,则常见用法有:

  • qaac64 -v 0 -q 2 "文件名.wav" --title "曲名" --artist "单曲艺术家" --band "专辑艺术家" --album "专辑名" --genre "曲风" --date 年 --track 轨号/总轨数 --disk 碟号/总碟数 --artwork "专辑封面.jpg/.png" -o "文件名.m4a"
    ↳这条命令将会以 Apple AAC Encoder 的最高质量 (-v 0 -q 2) 将 "文件名.wav" 压码为 "文件名.m4a" 并为其添加曲目信息与封面。需要注意的是,qaac 大概是我遇见的编码器里唯一一个支持将 png 格式的图片添加为封面的,其他的貌似都只支持 jpg 格式的图片——尽管人家音频格式本身可能不限制,但这些编码器一发现封面图片的后缀名不是 .jpg 就不给添加。

将上条命令中的 -v 0 -q 2 部分换为 -A 则可压码为 Apple Lossless 格式,但并不推荐这么做。

实际上,在当下,flac 已经 predominate 了无损音频领域,因此,如需进行无损压码,则任何非 flac 格式的留存都是不推荐的。

首次安装 iTunes 后须手动修改的 Import Settings 示例

iTunesEncode

下载地址:https://www.rarewares.org/aac-encoders.php#itunesencode

安装方式:解压式,将可执行文件放入一个已经加入了 %PATH% 的目录下。建议改名为 itec.exe 以方便使用,以下默认已做改名。该软件需要启用 .Net Framework 3.5/2.0, 如果没有启用,则在首次运行时会提示你启用。

更新:这个软件已经 16 年没有更新过了,估计再也不会更新了。

iTunesEncode (以下简称 itec) 是一个可以调用电脑上安装的 iTunes 来进行 AAC 压码的小软件。因此,这里有个前提就是:电脑上安装了 iTunes (下载地址:https://www.apple.com/itunes/download/win64), 但是需要注意的是,如今最新版本的 iTunes 要求最低 Windows 10 作业系统,因此对于 Windows 7 用户还是建议使用上方的 Nero AAC Codec.

而且这个小软件还需要你预先前往 iTunes 中调整好你的编码设置。具体来说,就是在首次安装完 iTunes 后,前往 Edit > Preferences, 在新弹出的窗口上找到 ‘Import Settings…’ 并在新弹出的窗口中为 ‘Import Using’ 选择 ‘AAC Encoder’ 并将 ‘Setting’ 选为 ‘Custom…’, 在点选 ‘Custom…’ 之后,在新弹出的窗口中,将 ‘Stereo Bit Rate’ 改为 ‘320 kbps’, 将 ‘Sample Rate’ 和 ‘Channels’ 改为 ‘Auto’, 然后一路 ‘OK’ 来关掉这三个窗口。这样 iTunes 中的设置就完成了。(参见右图)

常见用法:

  • itec -d -e "AAC Encoder" -i "文件名.wav" -o "文件名.m4a"
    aact "文件名.m4a" -meta:title="曲名" -meta:album="专辑名" -meta:artist="单曲艺术家" -meta-user:"album artist"="专辑艺术家" -meta:composer="作曲" -meta:genre="曲风" -meta:year=年 -meta:track=轨号 -meta:totaltracks=总轨数 -meta:disc=碟号 -meta:totaldiscs=总碟数 -add-cover:front:"专辑封面.jpg"
    ↳也就是说,这里推荐先使用 itec 来调用 iTunes 压码,然后使用 Nero AAC Encoder 的 tagger 来为压码后得到的 .m4a 文件添加曲目信息和封面。为什么呢?因为 itec 支持的曲目信息项目有点少——或者说,不知为什么,正好少了一个:专辑艺术家。并且我用它添加封面经常添加不上去。因此就推荐使用 Nero 的专门的 tagger 来添加曲目信息了。但是如果你一定要用 itec 来在调用 iTunes 压码的同时为文件添加曲目信息,也不是不可以:
    itec -d -e "AAC Encoder" -i "文件名.wav" -o "文件名.m4a" -a "单曲艺术家" -l "专辑名" -t "曲名" -g "曲风" -y 年 -n 轨号 -m 总轨数 -b BPM数值 -j 碟号 -k 总碟数 -r "专辑封面.jpg"
    ↳可以看到,虽然 itec 不知道为什么忽略了对「专辑艺术家」这一有用栏位的支持,但 itec 竟然原生支持为曲目写入 BPM 信息——尽管这并没有什么用,因为你除非一个个自己去测,不然没人知道歌曲的 BPM. 而这里 itec 能够写入的 BPM 是能且只能为 iTunes 识别的一个 tag——这倒也不怪 itec, 因为对于该如何记录 BPM 信息,各个软件的理解各有不同,因此如果需要让所有软件都能显示出一首曲子的 BPM 信息,你可能需要添加好几个名称以及值的记法完全不同的自定义 tag 栏位。

将上条命令中的 -e "AAC Encoder" 部分换为 -e "Lossless Encoder" 则可压码为 Apple Lossless 格式,但并不推荐这么做。

实际上,在当下,flac 已经 predominate 了无损音频领域,因此,如需进行无损压码,则任何非 flac 格式的留存都是不推荐的。

使用这种设置来调用 iTunes 软件进行压码所得到的 .m4a 文件和上方的 qaac 以例子中所用的参数压码得到的 .m4a 文件几乎是一模一样、分毫不差的,因为毕竟二者都援引了 Apple AAC Encoder, 而这两个例子下的设置也其实是相同的。

LAME

下载地址:https://www.rarewares.org/mp3-lame-bundle.php#lame-new

安装方式:解压式。将解压所得的可执行文件和 .dll 文件放入一个已经加入了 %PATH% 的目录下。

更新:手动前往上方下载地址处检查并手动更新。不过这是个年更乃至数年一更的软件,也没有必要经常检查。

LAME 可能是市面上最好的 MP3 格式编码器——尽管 MP3 并不是最好的音频格式,但如果你一定要获得 MP3 格式的文件(比如可能会遇到在一些老旧的播放设备上只能支持 MP3 格式文件的情况),那么来用 LAME 保准没错。

常见用法:

  • lame -b 320 "文件名.wav" "文件名.mp3" --id3v2-utf16 --tt "曲名" --tl "专辑名" --ta "单曲艺术家" --tv "TPE2=专辑艺术家" --tv "TCOM=作曲" --tg "曲风" --ty 年 --tn 轨号/总轨数 --tv "TPOS=碟号/总碟数" --ti "专辑封面.jpg"
    ↳这条命令可将 "文件名.wav" 以 320 Kbps 的恒定码率压码为 "文件名.mp3", 并相应地为其添加曲目信息及封面图片;
  • lame --abr 320 "文件名.wav" "文件名.mp3" --id3v2-utf16 --tt "曲名" --tl "专辑名" --ta "单曲艺术家" --tv "TPE2=专辑艺术家" --tv "TCOM=作曲" --tg "曲风" --ty 年/日期 --tn 轨号/总轨数 --tv "TPOS=碟号/总碟数" --ti "专辑封面.jpg"
    ↳这条命令与上面的差不多,只不过这次在编码时选择了 320 Kbps 的浮动码率;
  • lame --decode "文件名.mp3" "文件名.wav"
    ↳这条命令可将 "文件名.mp3" 解码为 "文件名.wav", 需要注意的是,由于 MP3 为有损的音频编码,因此即使解码为 WAV, 之前压码时造成的损伤也是无法挽回的。因此这条命令主要是用于将 MP3 转换为其他格式的时候。

oggenc2 与 oggdec

oggenc2 下载地址:https://www.rarewares.org/ogg-oggenc.php#oggenc-libvorbis, 找到第一个 ‘x64 Only’ 然后点击即可下载。

oggdec 下载地址:https://www.rarewares.org/ogg-oggdec.php#oggdec

安装方式:解压式。将两个压缩包内的可执行文件都解压出来并放入一个已经加入了 %PATH% 的目录下。推荐将 ‘oggenc2.exe’ 改名为 ‘oggenc.exe’. 以便于记忆,并且使其与 ‘oggdec.exe’ 对应(这也是为了便于记忆)。以下默认已做改名。

更新:手动前往上方下载地址处检查并手动更新。年更软件,不必查得很勤。

oggenc 和 oggdec 是压码以及解码 .ogg 格式音频的软件。ogg 也是一种有损的音频编码格式,而且比上不及 AAC, 比下倒是好过 MP3 但普及程度又远不及 MP3. 以前 ogg 格式主要用于网络上,然而最近几年也开始逐渐为下面要介绍的 opus 所取代。因此,正常来讲,不应该会遇到需要压码成 ogg 格式的情况,最多就是从 ogg 格式解码回 WAV 以便转换成其他格式。

不过,有这么一种传说就是,较早版本的 Android 更擅长使用 ogg 格式的音频文件作为铃声——传说说,要是用 MP3 或者 AAC 格式的音频文件的话可能会导致「响铃延迟」。很显然,如今的 Android 早已不存在这样的问题。不过 Android 的自带铃声倒确实还是 ogg 格式的。

常见用法:

  • oggdec "文件名.ogg" -w "文件名.wav"
    ↳这条命令可将 "文件名.ogg" 解码为 "文件名.wav", 需要注意的是,由于 ogg 为有损的音频编码,因此即使解码为 WAV, 之前压码时造成的损伤也是无法挽回的;
  • oggenc -b 500 "文件名.wav" -o "文件名.ogg" -t "曲名" -l "专辑名" -a "单曲艺术家" -c "album artist"="专辑艺术家" -c "composer"="作曲" -G "曲风" -d 年 -N 轨号 -c "totaltracks"=总轨数 -c "discnumber"=碟号 -c "totaldiscs"=总碟数
    ↳这条命令可将 "文件名.wav" ↳以 500 Kbps 的浮动码率压码为 "文件名.ogg", 并相应地为其添加曲目信息。是的,从这条压码命令中可以看出两个小细节:一是 ogg 编码默认便是浮动码率,二是 oggenc 并不支持为文件添加专辑封面。

opus codec

下载地址:https://opus-codec.org/downloads/

安装方式:解压式。将可执行文件解压并放入一个已经加入了 %PATH% 的目录下。

更新:手动前往上方下载地址处检查并手动更新。年更乃至数年一更软件,不必查得很勤。

Opus 是一种由 Mozilla 研发的新型有损音频编码——尽管是有损,但质量很高,在音质上堪比 AAC 的同时,在文件大小上却能获得更小的文件。不过,并没有什么音乐播放器支持它(写了这么半天我才想起来注明一下:本篇中所有的「音乐播放器」都是指可以拿在手里的那种音乐播放器,不是电脑上的「播放器软件」)。因此,如果考虑将其作为你的首要有损音乐编码并用来编码你的音乐,那你可能需要再考虑一下。那么 Opus 的应用在哪里呢?——在于解码 YouTube 视频的音频轨。越来越多的 YouTube 视频采用 Opus 来编码其音频轨,因此就需要 opusdec 来将其解码,以方便转码为其他格式。

常见用法:

  • opusdec "文件名.opus" "文件名.wav"
    ↳这条命令可将 "文件名.opus" 解码为 "文件名.wav", 需要注意的是,由于 opus 为有损的音频编码,因此即使解码为 WAV, 之前压码时造成的损伤也是无法挽回的。

wma2wav

下载地址:https://github.com/lordmulder/wma2wav/releases/latest

安装方式:解压式。将压缩包中的 ‘wma2wav-x64.exe’ 解压出来并放入一个已经加入了 %PATH% 的目录下。建议将其重命名为 ‘wmad.exe’,以下默认已做改名。

更新:应该不会有了。

wma2wav (以下称为‘wmad’) 是用来将 wma 文件解码回 WAV 的小程序。在任何时候都不应该考虑将音频文件压码为 wma——因为这种格式太专有了(为微软所有的音频编码格式),而且它既不流行也没有任何比其他格式更优秀的地方。因此,我们正好只需要这样一个小程序来面对万一需要将 .wma 文件转码为其他格式时的情况。

用法:

  • wmad -i "文件名.wma" -o "文件名.wav"
    ↳这条命令可将 "文件名.wma" 解码为 "文件名.wav", 需要注意的是,由于 wma 为有损的音频编码(其实也有无损的不过太少见了),因此即使解码为 WAV, 之前压码时造成的损伤也是无法挽回的。

Monkey’s Audio

下载地址:https://www.monkeysaudio.com/download.html

安装方式:安装式。安装完成后,须将 %SystemRoot%\..\Program Files\Monkey's Audio x64 加入至 %PATH%, 或者将 %SystemRoot%\..\Program Files\Monkey's Audio x64 下的 ‘MAC.exe’ 复制到一个已经加入了 %PATH% 的目录下。

更新:手动检查、手动安装更新。

Monkey’s Audio 曾经和 FLAC 并称两大最流行的无损音频编码格式——不过在最近十来年中越来越败给了 FLAC. 因此,当前,在任何时候都不推荐将音频文件压码为 Monkey’s Audio (以下简称 ‘APE’), 而是仅将已有的 APE 解码为 WAV (并进而压码为 FLAC 或使用其他有损编码格式来储存).

用法:

  • mac "文件名.ape" "文件名.wav" -d
    ↳这条命令可将 "文件名.ape" 解码为 "文件名.wav".

wavpack

下载地址:https://www.wavpack.com/downloads.html

安装方式:解压式。将压缩包中的 ‘wvunpack.exe’ 解压出来并放入一个已经加入了 %PATH% 的目录下。

更新:手动检查、手动更新。年更软件,不必勤查。

wavpack 是一种很小众的无损音频编码格式,因此,我们只需要它的解码小程序,以便用来解码成 WAV (并进而压码为 FLAC 或使用其他有损编码格式来储存).

用法:

  • wvunpack "文件名.wv" "文件名.wav"
    ↳这条命令可将 "文件名.wv" 解码为 "文件名.wav".

使用 FFmpeg 解码 AC3 为 WAV

用法:

  • ffmpeg -i "文件名.ac3" "文件名.wav"
    ↳这条命令可将 "文件名.ac3" 解码为 "文件名.wav".

更多 FFmpeg 用法详见下方

视频处理

FFmpeg

FFmpeg 是一款用于处理音视频文件的命令行程序,它的功能很强大,仅其说明文档就有 100+ K 词之多,若用 A4 纸列印出来,则大概要列印 360 页之多。因此几乎可以说没有人能够完全搞明白 FFmpeg, 这里所举的例子也只是 FFmpeg 各种应用的冰山一角而已。

下载地址及安装方法见上方

常见用法:

  • ffmpeg -i 源视频.mp4
    检测「原视频.mp4」的媒体信息,在这一步可以获得它的视频轨及音频轨都由哪些编码构成、码率如何。
  • ffmpeg -i 源视频.mkv -vn -acodec copy 输出的音频的文件名.opus
    假如我们看到源视频的音频轨的编码为 opus, 那么这条命令便可以原封不动地提取其音频,并将其保存为「输出的音频的文件名.opus」。
  • ffmpeg -i 源出视频.mp4 -ss 开始时刻 -t 持续时长 -vn -acodec copy -metadata title="曲名" -metadata artist="艺术家" -metadata album_artist="专辑艺术家" -metadata album="专辑" -metadata composer="作曲人" -metadata genre="曲风" -metadata track="该曲轨号/总轨数" -metadata disc="该曲所在碟/总碟数" -metadata date="年份或日期" 输出的音频段的文件名.m4a
    这条命令的作用为:在发现源视频音频部分的编码为 AAC 后,将「源出视频.mp4」中自「开始时刻」起,截出自此往后「持续时长」长度的音频段,保留原有的音频编码不转换,并添加相应的曲目讯息,然后输出至「输出的音频段的文件名.m4a」。其中,「开始时刻」和「持续时长」既可以写作 hh:mm:ss(.xx) 也可以写成纯秒数(也即 x(.yy))的形式,也就是说,-ss 70.1 -t 3651.2-ss 00:01:10.1 -t 01:00:51.2 是一样的,所截取的片段都是从 00:01:10.10 到 01:02:01.30 间的长度为 01:00:51.20 的部分。需要注意的是,那些 -metadata xxx="" 部分的曲目信息不是必须添加的,想不加就不写,也即可以从 -acodec copy 写完后直接写「输出的音频段的文件名.m4a」,而且这里只给出了 .m4a 的曲目信息添加方法,不同音频编码的 metadata 标签名是不一样的,上方命令中的样式并不能套用在别处。
    需要注意的是,在写时间点/时段长度方面,无论是用 hh:mm:ss(.xx) 形式还是纯秒数形式,秒后的小数位最多可有 2 位,如果没有则可不写。也即:1, 1.1, 1.11 都是允许的。
  • 如果希望截取的部分不仅保留音频,连视频也要保留,也即截出一段既有视频又有音频的选段,则可用:
    ffmpeg -i 源出视频.mp4 -ss 开始时刻 -t 持续时长 -vcodec copy -acodec copy 输出的视频片段的文件名.mp4
    或者写成:
    ffmpeg -i 源出视频.mkv -ss 开始时刻 -t 持续时长 -c copy 输出的视频片段的文件名.mkv
    其中 -c copy 就等于 -c:a copy -c:v copy 或者 -acodec copy -vcodec copy.
    (这里两个示例中文件的后缀名有所变化——这纯粹是为了表示,FFmpeg 支持的文件格式很多——mp4, mkv, mpg, avi, webm, flv 等等诸类视频均可上手。)

以上两例中的 -t 持续时长 也可换为 -to 截止时刻,「截止时刻」的表示法与「开始时刻」和「持续时长」一样。

  • 假如我们有一堆编码一致的视频段(比如都是使用同一部 Camcorder 录制的视频),如果我们想要将它们合并成一段,则可以:
  1. 将这些视频段放在同一个文件夹内;
  2. 新建一个 .txt 文件,在其中按照你所希望的顺序将视频文件名一行一个地写上,且要写成file '文件名1.后缀', file '文件名2.后缀', file '文件名3.后缀'…的样式;
  3. ffmpeg -f concat -safe 0 -i 文件列表.txt -c copy 输出的视频.后缀
    其中 后缀 应与「文件列表.txt」中那些视频的后缀保持一致。切记,这种方法合并视频只能用于已经确切知道所有待合并视频的编码是一样的。
  • 与之相反的,假如我们有一段完整的视频,如果我们想要将它分割成一个个时间长度差不多为「片段长度」的小片段,则可以:
    ffmpeg -i 完整的视频文件 -f segment -segment_time 片段长度 -c copy 输出的视频%3d.后缀
    其中 后缀 应与原视频的后缀保持一致。而 %3d 则表示分割成片段后的文件名以「输出的视频001.后缀」、「输出的视频002.后缀」、「输出的视频003.后缀」的方式来命名。「片段长度」的写法和上面的「开始时刻」以及「持续时长」一样,既可以写作 hh:mm:ss(.xx) 也可以写成纯秒数(也即 x(.yy))的形式。
  • ffmpeg -i 视频文件.mkv -map 0:s:0 第一条字幕轨.srt
    这条命令可用于从「视频文件.mkv」中提取其「第一条字幕轨.srt」。如果要提取第二条字幕轨,则将 -map 0:s:0 改为 -map 0:s:1, 以此类推。
    如果需要查看这个视频有多少条字幕轨且每一条字幕轨所对应的语言是什么,则请回看第一条——ffmpeg -i 视频文件.mkv.
  • 如果你恰好有某个视频的视频轨和音频轨是分开的(也即各自单独是一个文件)需要合并,则可用:
    ffmpeg -i 音频轨文件名.音频文件后缀 -i 视频轨文件名.视频文件后缀 -c copy 合轨后视频文件名.mkv
    这里需要注意的是,「合轨后视频文件名」的后缀可以不是 .mkv, 但由于我们选择了 -c copy, 因此要考虑到最终使用的容器是否支持这两条轨的编码。而 .mkv 无疑是最不挑的,因此也是最保险的选择。如果换做 .mp4 的话,则假若音频轨是 .opus, 那就要报错了。但如果已知视频轨是 .h264, 音频轨是 .aac, 那选择 .mp4 封装就完全没有问题了。
  • 如果你有一段音频(比如你的演奏录音或者你制作的电乐),想要将其上传到 YouTube 上去,但又觉得单传音频太过单调,而且你手头正好有一张很好看的图片,于是便想要制作成一个简单的视频,让其画面内容就是你所选择的那张图片,而音频内容就是你的音频文件,则可用:
    ffmpeg -loop 1 -i 图片文件名.图片文件后缀 -i 音频文件名.m4a -c:v libx264 -c:a copy -t 你的音频文件时长 输出的视频文件名.mp4
    需要注意的是,这里如果 -t 后面跟的是 n × 你的音频文件时长 的时间长度,则音频文件会被循环播放 n 遍,n 不一定需要是整数,但这个 n × 你的音频文件时长 要先自己算出来具体是多长再填入 -t 后面。以及,这里你的图片和音频文件要先准备好——也即,图片裁切到你所希望的视频画幅的大小(比如 1920 × 1080)、音频文件事先做好压码。
  • 如果你想给某段视频进行「自动截图」,则可用:
    ffmpeg -i 视频文件名.后缀名 -r 每秒钟抓取的帧数 -f image2 输出的截图%3d.png
    其中 -r 每秒钟抓取的帧数 部分如果省略不写则为逐帧抓取,也就意味着,如果是一个 60fps 的视频,则每秒钟就会抓取 60 张截图。而如果填入 -r 0.1 则意味着每 10 秒才抓取一张截图。输出的截图%3d.png 部分指定了保存的截图的命名规则,也即:「输出的截图」字样 + 001/002/003 … 编号 + .png 后缀。%3d 指定了用几位数字进行编号,如果改为 %5d 便是用 5 位数字来编号(也即为 00001/00002/00003 … 样)。
  • 如果你想给某段视频顺时针旋转 90°, 180°, 或 270° (常见于在电脑上观看一段手机录制的视频结果发现角度不对的时候), 则有:
    ffmpeg -i 原视频文件名.后缀名 -c copy -metadata:s:v:0 rotate=90 (或 180 / 270) 调整后视频文件名.与之前相同的后缀名
    这里需要注意的是,旋转的角度只能是 90°, 180°, 或 270°, 其他的度数是不行的。
  • 最后,使用 ffmpeg 还可以录屏(或者录制 WebCam, 这里以录屏来举例),只需:
    ffmpeg -f gdigrab -framerate 30 -i desktop -c:v libx264rgb -crf 0 输出到的视频文件.mkv -f dshow -i audio="音频输入源"
    其中 -framerate 30 表示录制的视频帧率是 30 fps. 尽管一般显示屏的刷新帧率是 60 fps, 但将录屏视频的帧率降到 30 fps 也不会看起来差太大。后面 -i audio="音频输入源" 中的「音频输入源」的填写需要先使用命令 ffmpeg -list_devices true -f dshow -i dummy 来列出 ffmpeg 能够调用的 DirectShow 来源,然后在其中选择需要的那个,并将使用 ffmpeg -list_devices true -f dshow -i dummy 列出来的那个名字照抄回 -i audio="音频输入源" 中。就比方说,我这里只列出了我的麦克风,并告诉我它的名字为 Microphone (High Definition Aud (是的,名字没写完就断了,但我们就得要这个断了的), 而没有列出电脑的声音输出,因此我就只能在录屏的同时录麦克风收取的外界声音,而不能同步录制电脑播放的声音。而要在录屏时同时录制外界声音,则在我这里就要把 -i audio="音频输入源" 部分写成 -i audio="Microphone (High Definition Aud".
    这样录制出来的视频看起来还凑合,画质并不是特别好,但总归是能用的。1920 × 1080 的画幅下以 30 fps 录制 1h 的文件大小大概在 3.2 – 3.6 GB 左右。

以上所举的这几个 FFmpeg 运用的小例子中,除了最后一例外,其他的都是「无损」作业,也即:无论是截取、分割、合并还是旋转,都没有对所涉及的音视频进行重新编码,因此对于被处理的音视频的画质和音质都没有损伤。FFmpeg 作为一款极为强大的音视频处理工具,自然也支持重新编码的有损作业,比如——

  • ffmpeg -i 原视频.后缀 -c:v libx265 -preset slow -crf 23 -c:a libopus -b:a 320k 转换后视频.mkv
    即为将原视频(比如你刚刚用上方的命令录屏得到的视频)转换为同画幅大小、同 fps 的、视频编码为 HEVC 的、音频编码为 Opus 且码率为 320K 的新视频文件。转换后得到的文件大小大概在原文件大小的 ½ 以下。
    其中的 -preset 和 -crf 决定了转换后视频的画质、文件大小以及压码所用的时间。同 -crf 条件下,-preset 越慢,则文件越小;而 -crf 越小,则画质越好文件越大;这两个设置都越往「好」的方向去设置,则所需花的转码时间就越久——有的时候转码时间上会相差十倍乃至几十倍之多。
    这里的 -preset 设为了 slow, -crf 设为了 23, 经过实验发现这样设置可将 1920 × 1080 @ 30 fps 的视频压到一分钟 50 MB 以内(或一小时 3 GB 以内)且输出的画质还算可以,以 2021 年主流中高端笔电的配置,整个压码的时间应该在视频时长的 1.5 倍之内。如果不设 -preset 及 -crf, 则视视频内容的不同而定,其转换后得到的视频的文件大小应该会跟这样设置后的大小近似或者略小些,画质上也可能有些微不仔细看看不出来的减退,压码所用的时间也可能更快一点点。不过还是推荐设上 -preset slow 和 -crf 23, 因为这样可以保证一个还能看得过去的画质(这并不是很好的画质,只能算是「勉强能看」的画质。如果我要追求很好的画质,则会将 -preset 设为 veryslow, -crf 设为 15, 但那样压码时间大概会变为原来的 10 倍乃至更久,转换后视频的文件大小也会至少胖大一倍,不过视频的质量应该会有不错的提升。注:-preset 的参数有: placebo, veryslow, slower, slow, medium, fast, faster, veryfast, superfast, ultrafast; -crf 的参数区间为 0 至 51.)

抱歉无法详说 FFmpeg 在转码方面的更多细节了。因为那牵扯到的东西太多了,而且我现在的电脑算力颇为有限(已是 10 岁高龄的老笔电了),很多东西都没法自己去试验或实践。如果可以的话,在未来时机成熟的时候,我会就 FFmpeg 的转码部分单独写一篇。

图片处理

libwebp

下载地址:https://storage.googleapis.com/downloads.webmproject.org/releases/webp/index.html 找到页面上最新版本的(使劲往下拉)适用于 64 位 Windows 的 libwebp 的压缩包并下载之。

(需要注意的是,这个 libwebp 只能用于在命令行上操作 WebP 文件(比如转成 WebP 或者从 WebP 转出),但不能用于让 Windows Photo Viewer 支持显示 WebP 图片。如需让 Windows Photo Viewer 支持显示 WebP 图片,则需要下载这个页面最上方的 ‘WebpCodecSetup.exe’ 并安装之。)

安装方式:解压式。将 ‘bin’ 子文件夹中的所有文件解压并放入一个已经加入到 %PATH% 的目录下。

更新:手动检查,手动更新。更新频率略小于「年更」。

libwebp 是用来将图片转换为 WebP 格式、或从 WebP 格式将图片转换成其他格式的命令行工具。WebP 格式的图片在文件大小上很有优势。但即使是最高质量的 WebP 图片,如果仔细看的话,在色彩上还是会有「降质」。原因?因为 WebP 默认只能使用 YUV 颜色模式,而 YUV 就算把画质调到最高也还是比不上 RGB 好看,即使我这么大条的人都能看出区别来。因此,对于收藏在本地的照片,并不建议保存为 WebP 格式。但对于放在网路上的用于网页显示的图片,则大可转为 WebP 来获得一个更小的文件大小。

用法:

  • dwebp "文件名.webp" -o "文件名.png(或.jpg)" 将 WebP 图片转换为 PNG (或 JPEG) 格式的图片;
  • cwebp -q 90 -z 9 -m 6 -sharp_yuv "文件名.bmp/png/jpg/tif…" -o "文件名.webp" 将各种格式的图片有损地转换为 WebP 图片。
    需要注意上方高亮出来的 -q 90 部分,一般来说,质量参数达到 80 就不太容易被一般人看出画质上的「降质」了(除非放大了一点点地看)。对于不知道经过几手传布的网图,甚至可以考虑将质量参数降到 70 或 75. 但对于自己比较有信心的高质量图片,还是将质量参数定在 85 到 95 之间比较好。因此这里给出的 90 是一个比较保守的值。一般来说这样压缩后的图片,既能够做到文件大小小大幅减少,又不至于有可见的画面质量降低。另外需要注意的是,如果不是在 Windows 系统上,还可以加上 -metadata exif 来将原图的 EXIF 信息传递给转换后的 WebP 图片。但在 Windows 系统上这一功能至今并未被官方支持(日后是否会支持就看官方的意思了)。
    -z 9 -m 6 -sharp_yuv 部分为一些其他可以增强画质的选项,这一部分不用改变参数,照抄就行了。

optipng

下载地址:http://optipng.sourceforge.net/, 需下载 ‘optipng-x.x.x(这些 x 代表版本号)-win32.zip’.

安装方式:解压式。将可执行文件解压并放入一个已经加入到 %PATH% 的目录下。

更新:手动检查,手动更新。更新频率为数年一更甚至弃更了。

optipng 是一个可以优化 PNG 图片大小的小工具——优化 PNG 图片大小,但同时不损伤 PNG 图片画质。请认准这一家,其他任何宣称可以优化 PNG 图片大小而不损伤画质的都是在撒谎。

其用法很简单:

  • optipng -o7 -zm1-9 "文件名.后缀"
    其中 "文件名.后缀" 可以是一个 PNG 文件——这样它就会优化这个 PNG 文件;也可以是 BMP 或 TIFF 等常见的无损点阵图图片格式——这样它就会将 BMP 或 TIFF 图片转换为 PNG 并尝试无损压缩至最小。

需要注意的是,由于 optipng 需要做大量的计算去尝试,因此它干活儿干得非常慢,一般来说,屏幕截图这种的 PNG 优化优化挺有必要的(能够节省 5% 到 50% 不等的文件大小),如果是照片之类的,并且在使用比如 Photoshop 保存时已经选择了最小体积,那优化起来就有些得不偿失了——很有可能一张照片要花上数分钟乃至十几分钟的时间才能优化完成,而且省出来的文件大小还不多。——当然,optipng 到底是快是慢,还是取决于你的处理器的能力。如果机器足够好的话,也可以挺快的。所以——小明,你为什么要买十万块钱的高配电脑?小明:为了运行一些命令行小程序(比如 7z, 比如 optipng, 比如 ffmpeg…)。

ExifTool

下载地址:https://exiftool.org/#alone, 就下载这个 ‘Windows Executable’.

安装方式:解压式。将可执行文件解压,重命名为 ‘exiftool’ 并放入一个已经加入到 %PATH% 的目录下。(重命名这步必须做,也是官方推荐做的。)

更新:手动检查,手动更新。更新频率略频繁,几个月一更吧。

ExifTool 是用来修改图片的 EXIF 信息的工具。

其用法很简单:

  • exiftool "文件名.后缀" 为在命令行中显示出"文件名.后缀"这张图片的 EXIF 信息。其支持的文件格式详见这里
  • exiftool -all= "文件名.后缀" 可以将"文件名.后缀"这张图片的全部 EXIF 信息完全清除;
  • exiftool -TagsFromFile "文件名 1.后缀" "-all:all>all:all" "文件名 2.后缀" 可以将"文件名 1.后缀"这张图片的全部 EXIF 信息传给"文件名 2.后缀",并覆写"文件名 2.后缀"中已有的 EXIF 信息;
  • exiftool -"TAG1"="值1" -"TAG2"="值2" -"TAG3"="值3" "文件名.后缀" 可以将值为「值 1」的 ‘TAG1’, 值为「值 2」的 ‘TAG2’, 和值为「值 3」的 ‘TAG3’ 这三个 TAG 以及其值写给"文件名.后缀"。需要注意的是,其实"文件名.后缀"也可以不止一个,只需简单地往后继续罗列,即可直接将一个或多个 TAG 的值写给所罗列的一个或多个文件。对于不同格式都支持哪些 TAG, 可参见此处
    如果要写入的值涉及到非常见拉丁字符,则需要加上 -charset utf8 选项;而这样做的前提是,别忘了 chcp 65001;
  • exiftool -FileCreateDate="值" "文件名.后缀" 可以修改"文件名.后缀"图片的「文件创建日期与时间」,但这一条命令必须单独运行,如果把这个 TAG 和其他 TAG 一起写到一条命令里去赋予某个文件,它简单地不会工作。所以如果一定要修改文件的创建日期,那么在改完其他 TAG 之后(其他 TAG 都可以在一条命令里写完),再重新单独来一遍这个 TAG 就行;
  • ExifTool 所使用的日期格式是 YYYY:MM:DD HH:MM:SS+HH:MM, 也就是类似于 2021:03:21 12:34:56+08:00 的样子。我不是很瞭解最后这个时区代码是表示前面部分是 GMT 然后最后来个加法还是前面部分就是地方时间然后最后以时区代码来标识一下,因为我一直用且只用 GMT 时间;
  • 在默认状态下,ExifTool 在编辑图片的 EXIF 信息时会为图片创建一个名为 文件名.后缀名_original 的备份文件,如果不需要这样的备份文件,可以加上 -overwrite_original 选项,即可避免备份文件的产生;
  • 更多常见用法可参见: https://exiftool.org/examples.html.

如上所述,ExifTool 是一款很强大的编辑图片 EXIF 信息的软件。而它唯一的美中不足就是……运行起来有点儿慢——每处理一张图片的 EXIF 信息都需要一秒左右的时间。

文档处理

pandoc

下载地址:https://github.com/jgm/pandoc/releases/latest, 需下载页面上的 ‘pandoc-x.x.x(这些 x 代表版本号)-windows-x86_64.msi’.

安装方式:安装式。

更新:手动检查,如发现新版本则需要手动下载新版安装包来安装。更新频率还……挺频繁的,基本上几天一更。不过不更新也能用。

pandoc 是一个非常强大的标记文档转换工具,可以在非常多钟标记文档间相互转换。比如从 markdown 转换为 HTML 或者从 docx 转换为 markdown 等等等等。

常用用法:

  • pandoc "文件名.md" -o "文件名.html" --metadata title="页面标题" -s
    假如你有写 markdown 文档的习惯,则可用这条命令一键转制 HTML. 由于加入了 -s 指令,你将获得一个完整的 HTML 页。如果不带 -s, 则转换出来的只是 HTML 代码块;
  • pandoc -r markdown "输入文件名.txt" -w mediawiki -o "输出文件名.txt"
    默认地,pandoc 可以透过读取文件的后缀名来判断输入和输出格式,比如如果输入文件后缀是 .docx, pandoc 就知道它是一个 MS Word 文档,而如果输出文件后缀是 .odt, 就知道要输出成 LibreOffice 的文档。但假如这种标记文档没有自己的「官方」后缀呢?比如 MediaWiki 所用的标记语言,就没有什么特别定义的「后缀名」,如果你想保存在本地的话,保存成什么都可以,通常来说,可能是 .txt. 而如果你平时虽然写 markdown 文档,但却并不保存成 .md 格式,而是也保存在 .txt 中,那 pandoc 也就不知道你写的是啥标记语言的东西了。因此,遇到这样的情况就要指定其标记语言为何了,也即加入 -r xxx 来指定 pandoc 要读取的文本是什么样的标记语言,并加入 -w yyy 来指定 pandoc 要写成怎样的标记语言。就如同这条命令一样,虽然输入和输出文件都保存为 .txt, 但 pandoc 明白,读取的那个文本文件是用 markdown 标记语言写的,而让它输出的文本文件则需要用 mediawiki 标记语言。
  • pandoc -f markdown -t mediawiki "文件名.txt" -o "文件名.txt"
    如果你并不是想把使用甲标记语言撰写的 A 文件转换为使用乙标记语言的 B 文件,而是希望直接在这个文件(通常是文本文件)里把原来用的标记语言甲换为新的标记语言乙,则可以使用 -f xxx -t yyy 来指定 pandoc 将这个文件内的标记语言从 xxx 变为 yyy. 比如在这条命令中,pandoc 就会把 "文件名.txt" 这个原本是用 markdown 标记语言写的文本文件直接在原文件内转换为用 mediawiki 标记语言写的。

当然,原装 pandoc 的转换能力并不优秀,你不能指望它把一个现代风的网页给你转换成排版精美、宛若出版物一般的 docx 或者反过头来将一个排版复杂的 docx 转换成一个赏心悦目的网页。它只能做最简单的转换,在转换过程中,诸多复杂的细节都会被抛弃。因此,pandoc 最适合的使用场景就是做一些简单的 markdown 转 HTML 或 mediawiki 之类的。(当然 pandoc 还有高级玩法,比如模板加持,不过那就太高深了。)

其他

以下列举的这些 CLI Apps 都是我没有用过的(无论是暂时用不到还是已经使用其他 CLI Apps 替代了还是觉得这份工不该由 CLI Apps 来完成),但觉得仍有必要列举在此的。

  • Aria2: https://github.com/aria2/aria2/releases/latest
    对于这个,我个人将它的功能分给了旧版 Firefox 插件 DownThemAll! 去下载 HTTP(S), qbittorrent 去下载 BT, BaiduPCS-Go 去下载百度网盘,再加上 youtube-dl / you-get / svtplay-dl 去下载网路视讯,就足以满足我的所有下载需求了,所以并不需要这个。但它仍然是一个好项目,值得列出。但官方就是不愿意为 Aria2 加入 socks5 代理支持,这就让人……反正一个是 ExifTool 的开发者不愿加入对 WebP 的 EXIF 写入支持,一个是 Aria2 不愿意加入对 socks5 代理的支持让人觉得……世事总是有些遗憾的。
  • OpenCC: https://github.com/BYVoid/OpenCC/wiki/Download