Copyright(c) 2018-2021 yyfll(yanyifei66@gmail.com)

本批处理是遵守GNU通用公共许可协议第二版(GPLv2)的自由软件

本批处理是用于将字幕和字体通过MKVmerge快速封装到MKV中的无用批处理

本批处理需要MKVmerge作为依赖

最近更新

ExtL 1.05 (重要更新)

此版本包括一个重要问题修复和多个功能改进,建议立刻更新。

  1. 修复了只输入一个文件而非文件夹时无法正常运行的问题
  2. 完成了对UNC路径(或称 通用命名规则 / 局域网路径)的支持
  3. 内置ReplaceBatch模块更新到V3F2_2
  4. 内置ReplaceBatch模块已支持 新CMD的命令扩展 提供的 Replace 方法,速度更快

ExtL 1.04 (重要更新)

此版本包括一个重要问题修复和一个功能改进

  1. 修复了由于ExtL1.03更新导致的没有字体时运行封装崩溃的严重问题
  2. searchfilter不再基于findstr,速度更快更准确(searchfilter的老坑终于被填上了...)
  3. 变量管理器已支持searchfilterdebug_mode变量的设定

目录

    1. 为什么我不推荐直接使用ASFMKV嵌入完整字体包
    1. 系统要求
    1. 开始混流
    1. 格式兼容性

    • 4.1. 可接受的媒体容器格式
    • 4.2. 可接受的字幕格式
    • 4.3. 可接受的字体格式
    • 4.4. 输出的媒体容器格式
    1. 常见问题
    1. 自定义变量

    • 6.1. 修改方式
    • 6.2. 变量表
    1. 外部调用

    • 7.1. 调用开关
    • 7.2. 开关解释
    1. 挂接组件
    1. 内部组件

1. 为什么我不推荐直接使用ASFMKV嵌入完整字体包

ASFMKV并没有抽取字体子集这种高级功能,这导致ASFMKV只是很单纯的把整个字体包作为附件塞在MKV文件的头部

这样做的结果就是MKV文件头部臃肿,在流视频下载头部的时候会非常吃力

整个字体包往往会比字幕所需的子集大很多,所以体积大得很没有必要

我建议各位如果有一点技术力,也请不要直接使用ASFMKV嵌入整个字体包而是抽取了字体子集再用ASFMKV嵌入

(我并没有研究过如何抽子集,应该有一键式抽取嵌入的软件,所以ASFMKV确实没什么价值)

2. 系统要求

  • 系统:Windows 8 / 8.1 / 10 (32位/64位均兼容)

注意:Windows 7系统的用户,由于CMD版本过旧,若无法正常运行,请参考常见问题

  • 处理器:能够正常运行Windows
  • 内存:能够正常运行Windows
  • 显卡:能够正常运行Windows
  • 网络:不需要
  • 磁盘性能:只要不卡死都无所谓。但建议持续读写速度80MB/s以上,传输速度越快处理越快(重封装说到底就是拷贝)
  • 磁盘空闲:10MB(视频存放盘至少需要拥有[视频大小×2+字幕+字体包大小]的空间)
  • 依赖组件:mkvmerge.exe必须在同一文件夹下或在%path%中的任意文件夹下

从EU1.03起,mkvmerge的路径可以在ASFMKV中设定,详见下方自定义变量

注意:ExtL1.05之前的版本中,由于ASFMKV需要定位到源目录,故网络路径不受支持

3. 开始混流

  1. 双击打开"ASFMKV.bat"
  2. 输入要混流视频所在的路径或该文件的完整路径(或从资源管理器把文件/文件夹拖入CMD窗口)

其实你也可以直接把文件/文件夹直接拖进ASFMKV,就像拖进回收站那样

  1. 等待ASFMKV生成文件列表
  2. 等待MKVmerge完成混流任务
  3. (可选)如果混流成功则删除源文件

4. 格式兼容性

以下格式兼容性是对非ExtL版本而言的,ExtL版本有内建扩展名表,用户可以自行更改,完整的支持列表见mkvmerge Doc

4.1. 可接受的媒体容器格式

  • MKV (Matroska Video)
  • MP4/MPEG/M4V/MPG (MPEG)
  • RM/RMVB (RealMedia)
  • AVI (Audio Video Interleaved)
  • FLV (Flash Video)
  • WMV (Windows Media Video)
  • OGG (OGG)
  • MOV/QT (QuickTime)
  • M2TS (MPEG-2 Transport Stream)
  • WEBM (Google WebM) (1811GAMMA+支持)

以下格式表是内建的,不可更改

4.2. 可接受的字幕格式

  • ASS/SSA (SubStation Alpha)
  • SRT (SubRip Text)
  • SUP/PGS (HDMV Presentation Graphic Stream Subtitles)
  • IDX+SUB (MPEG-4 Timed Text)

4.3. 可接受的字体格式

  • TTC/TTF (TrueType Font)
  • OTF (OpenType Font)

4.4. 输出的媒体容器格式

  • MKV (Matroska)

5. 常见问题

为什么我打不开ASFMKV?

在 Windows 7 SP1 及更早版本的 Windows 对 chcp代码页切换的兼容性非常的差,以至于一切换就有可能导致崩溃。

请您用记事本打开ASFMKV,删除文件头部的 chcp 65001,再选择"另存为"并在下方选择以"ANSI"编码保存。

如果您有其他更好的编辑器,操作方法也是类似的,删去 chcp 65001

并选择使用"ANSI"编码或系统代码页(简体中文系统为"GB2312",也兼容"GB18030"、"GBK")来保存

为什么ASFMKV显示输出成功但没有任何文件输出?

在ExtL1.03及之后的版本中,一切文件没有得到处理的原因都会在运行结束后输出在屏幕上

请检查您的输入文件夹和ASFMKV的自定义变量设定,有以下可能性:

  • 您的文件夹里只有字体文件而没有外挂字幕,同时您没有给NotSub变量赋值
  • 您的文件夹里只有字体文件,而外挂字幕在子文件夹,同时您没有给SubDir赋一个非0的值

请使用文本编辑器打开ASFMKV,修改NotSub和SubDir

(推荐兼容Batch语法高亮的编辑器,这样比较好找变量位置,如VS Code)

或在使用EU2.10/ExtL1.00及更新版本时时在路径处输入set打开内置的设定管理器

(这样修改的设定并不会保存,下一次还需要再修改)

为什么ASFMKV总是显示错误

"mkvmerge" is not recognized as an internal or external command...

在EU2.12f和ExtL1.02f(GitHub为ExtL1.02)前的几个版本,由于对mkvmerge检测系统的设计失误

导致找不到mkvmerge时会弹出错误而不是直接禁止继续使用

在ExtL1.03更新前的版本中,如果mkvmerge不在path下但和ASFMKV放在同一目录,则第一次运行时会显示检测到了mkvmerge

但运行时无法输出任何文件,第二次运行时就会显示以上错误

该问题已经在ExtL1.03中完全修复,请尽快更新

6. 自定义变量

为了符合不同用户的使用习惯,ASFMKV有着大量的自定义变量来符合不同用户的使用习惯

ASFMKV的主界面的"[CUSTOM SETTINGS]"详细显示了各自定义变量的情况和影响

6.1. 修改方式

自定义变量位于ASFMKV的头部,用文本编辑器打开就能看到,每个变量都有详细的解释

推荐使用有Batch语法高亮功能的文本编辑器,如VS Code、UltraEdit,不然改起来很痛苦

在修改的时候只需要把行首为set的那一行,等号后面的值修改为目标值就行了,如set "notsub=A",空缺就直接set "notsub="

EU2.10/ExtL1.00-MG 及更新版本

在主界面(即要求您输入文件路径、有一坨信息提示的时候)的"文件路径"处输入set就可以打开内置的变量管理器

使用内置变量管理器只能更改本次使用时的设定,关闭窗口即重置

6.2. 变量表

ExtList(仅ExtL版本)
控制ASFMKV的多媒体文件输入过滤器,决定哪些扩展名可以输入

NotDel
控制是否要删除输入文件

NotSub
控制在没有外挂字幕的时候(或者找不到外挂字幕的时候)是否要封装字体

NotFont
控制是否封装字体

OutPath
设置文件输出路径(ExtL1.02及之后版本均默认为"[源目录]\REMUX",其他版本都是直接输出回源目录)

SearchFilter
使用通配符*?来过滤输入文件

ui_language
控制mkvmerge封装时显示的语言,并不更改ASFMKV的主要语言(因为只有一种语言嘛)

priority
控制mkvmerge的进程优先级,优先级越高,被其他使用磁盘的应用阻断和干扰的程度就越小

SubDir
控制是否搜索子目录

DEBUG_MODE
启用命令回显并阻止所有CLS清屏

NUL_OUTPUT
测试用,输出到NUL(即不输出文件)

EXEin
mkvmerge的路径,用于mkvmerge不和ASFMKV在同一目录或不在%path%下的情况

7. 外部调用

(全部更新至EasyUse1.0)

7.1. 调用开关

?h 			显示帮助(最高优先)
?del [y/n] 		是否删除输入文件
?sub [y/n] 		没有字幕时是否嵌入字体文件
			(注意:sub开关在开启时会自动允许字体封装,即notfont为任意值)
?out [path] 		输出目录
?dir [y/n] 		是否搜索子目录
?dbm [y/n]:[y/n] 	是否使用测试模式和空输出(测试模式开关:空输出开关)
			(注意:dbm开关若只输入一个y则同时开启测试模式和空输出,反之亦然)
?ffl [filter] 		文件过滤器
?pri [0-4] 		选择进程优先级
?uil [1-4/input]	选择mkvmerge的语言
?exe [path]		选择mkvmerge的路径

调用注意

开关必须整体,整体,整体用引号括起,比如
"?out %APPDATA%\test ?pri 3 ?dbm n:y"
也可以只括起单个开关,但是这样最多只能8个开关,比如
"?out %APPDATA%\test" "?pri 3" "?dbm n:y"

调用方法①(CMD)

ASFMKV "输入路径" "[调用开关]"

调用方法②(CMD)

Call "(带有某些符号的路径)\ASFMKV" "输入路径" "[调用开关]"
(如果路径或文件名中含有括号、空格、与号或其他影响CMD的符号,可以使用Call指令并用双引号括起路径)

调用方法③:

直接往BAT拖入文件或文件夹,自动运行重封装并输出到源文件夹
该情况下所有开关均为默认值

7.2. 开关解释

进程优先级

[0] lowest(最低)
[1] lower(较低)
[2] normal(标准)
[3] higher(较高)
[4] highest(最高/实时)

MKVmerge输出语言

快速语言选项:
[1] en(English)
[2] zh_CN(简体中文)
[3] zh_TW(繁體中文)
[4] ja(日本語)
该语言选项仅应用于mkvmerge输出部分,并仅在支持时使用
您也可以直接输入语言,比如 "?uil zh_CN"
可选的语言详见"mkvmerge --ui-language list"

文件过滤器

过滤器使用标准文件搜索语法,例如:
"*.mkv"将只输入所有文件后缀名为MKV的文件
"*SEFO*.*"将会输入所有文件名中含有"SEFO"的文件(不区分大小写)且不管后缀名是什么
其实主要就是通配符的问题罢了

8. 挂接组件

本BAT使用了以下挂接组件

MKVmerge(LICENSE: GPLv2)

Copyright© 2002– Moritz Bunkus
https://mkvtoolnix.download/downloads.html

Replace for Batch(LICENSE: MIT)

Copyright© 2018-2019 yyfll(yanyifei66@gmail.com)
* [Delete AND(&) (DIR Ver.)]
	该版本是独立程序,用于替换文件夹下所有符合匹配并带有"&"号的文件名
* [Replace for Batch V3F2_2]
	使用CALL接口的泛用性Replace模块,可供挂接使用

9. 内部组件

本BAT使用了以下原创组件

Copyright© 2018-2019 yyfll(yanyifei66@gmail.com)
Module_FormatDate	日期格式化模块
Module_ReplaceBackSlash	[专用]JSON转义模块(EU-JSON)
Module_EncapsulationMKV	[专用]封装控制模块
Module_GetOutputPath	[专用]输出控制模块
Module_DEBUG		除错辅助模块