简介:TMPGEnc-2.54.37.135 是一款面向视频转码与光盘制作需求的 MPEG 编码工具,适合需要将多种视频源转换为 MPEG-1、MPEG-2 及 H.264/AVC 格式的爱好者与制作人员使用,可服务于视频压缩、存储分发和 DVD/蓝光素材准备等场景。压缩包共 22 个文件,约 1011KB,包含可执行程序、动态库组件、编码模板、双语说明文档、网页帮助及个性化配置文件;其中 mcf 模板覆盖 VideoCD、SuperVideoCD、DVD 等常见规格,txt 与 html 提供许可、说明和帮助信息,dll 与 acf 则对应功能扩展和参数保存。已有 199 人浏览学习,说明其在旧版视频编码工具中仍有一定参考价值。读者可从中获得一套可直接研究的编码参数样本、模板配置思路和双语文档线索,便于理解传统 MPEG 编码流程、输出规格差异及模板化配置的组织方式。
1. 探索 TMPGEnc 2.54.37.135:老编码器在今天还有什么实际用途
把 TMPGEnc 2.54.37.135 这个压缩包解出来,很多人第一反应是“这软件还能在现在的系统上运行吗”。能,而且当你需要产出严格合规的 MPEG-1 或 MPEG-2 码流时,它比一堆现代转码器更直接:码率、GOP 结构、量化矩阵、VBV 缓冲全部放在界面上,改完立刻能看到预估体积和编码耗时。它主要解决“把视频转成一台十几年前的车机、点歌机或老 DVD 播放机认得且不花屏的格式”,而不仅仅是“把视频转小”。适合两类人:手里有老设备要投放片子的人,和想弄明白 MPEG-2 参数怎么影响画面的人。装好之后第一件事不是点“开始编码”,而是把输入链路搭对,这一步决定了后面八成的失败。
2. 输入链路:VFAPI、色彩空间与 AviSynth 帧服务
2.1 直接拖 AVI 进去,失败概率很高
TMPGEnc 2.54 是 32 位程序,读 AVI 走的是 Video for Windows 那套老接口,也就是系统里注册过的 VFW 解码器,比如 Indeo、Cinepak、DV、早期 DivX 3/4。问题在于现在的系统上这些解码器基本绝迹,64 位环境里 32 位 VFW 编解码器又常常注册不全。表现就是四种:弹“无法打开视频文件”、能打开但只读到第一帧、预览窗口全黑、读到的时长明显不对。
不少人第一反应是去装各种万能解码器包,这条路我不推荐。一方面来路不明,另一方面装多了反而会让系统里多个解码器互抢,DirectShow 和 VFW 各挑一个,排查起来像猜谜。更稳的思路是把解码这件事从 TMPGEnc 手里拿走:交给 AviSynth 做,再用 VFAPI 把 AviSynth 的输出伪装成 TMPGEnc 能认的“未压缩 RGB24 AVI”喂回去。这样 TMPGEnc 只负责编码,不负责猜你的源文件是什么编码格式。
这个链路还有一个副作用要知道:VFAPI 传的是 RGB24 裸帧,720×576 一帧约 1.2MB,25fps 就是 30MB/s 的内存拷贝。这就是它慢的根源之一,也意味着输入分辨率不要给得比目标大太多,否则大部分时间都耗在无意义的缩放和搬运上。
2.2 三件套装好,再做一次最小验证
装之前先确认位数:TMPGEnc 2.54 是 32 位,AviSynth 必须装 32 位版本,VFAPI 也必须是 32 位注册。64 位系统上这两套组件是并存的,装错了不会报错,只是 TMPGEnc 永远看不到那个 .avs 文件。
步骤按这个顺序走:
- 装 32 位 AviSynth 2.5.x,装完在任意播放器里打开一个 .avs 能出画面才算通。
- 装 VFAPI 帧服务组件,它会在系统里注册一个“伪 AVI”的读取能力。
- 把 AviSynth 侧的 vfapi 插件补进 VFAPI 的插件目录,让 VFAPI 能识别 .avs 脚本而不是只认它自己格式的项目文件。
- 验证:写一个只有一行的 .avs(比如直接
DirectShowSource("某个文件")),在 TMPGEnc 的打开对话框里把文件类型切到 VFAPI 项目或“所有文件”,选中这个 .avs,看能不能读出正确的帧数和分辨率,并且拖动预览滑块有画面。
第四步是分水岭。读不出帧数,说明 VFAPI 没接上 AviSynth;能读帧数但预览黑屏,说明 AviSynth 内部的解码器没选对;能预览但一编码就崩,多半是色彩空间没在脚本末尾转成 RGB24。
提示:验证阶段别用目标分辨率的大素材,先拿一段十秒的小片段跑通,能省下大量等待时间。
2.3 一个能直接抄的 .avs 骨架
下面这个脚本是我平时用的骨架,改文件路径和帧号就能跑。它做了四件事:指定解码器、切片段、缩放到目标分辨率、统一色彩空间和场序。
# 源:先用 DirectShowSource 兜住大多数现代容器,不稳再换 AviSource 或 ffms2 src = DirectShowSource("D:\work\source.mkv", fps=25.0, convertfps=false) # 先切片段再缩放,避免对用不上的帧做缩放和色彩转换 src = Trim(src, 1200, 1200 + 25*90 - 1) # 从第 1200 帧起,取 90 秒 # 缩到目标分辨率,Lanczos 在高频细节上比 Bicubic 干净 src = LanczosResize(src, 720, 576) # 声明场序,交错素材不声明会让编码器自己猜,猜错就是横纹 src = AssumeTFF(src) # VFAPI 只吃 RGB24,放在最后一步,减少中间环节的色度损失 src = ConvertToRGB24(src, matrix="rec601") return src参数逐条说明。fps必须显式给,源文件如果是可变帧率,不给这个值 TMPGEnc 会按它自己猜的帧率算时长,出来必然音画不同步。convertfps=false是保证不插帧,宁可让时间轴短一点,也不要让画面出现重影。Trim用帧号而不是时间码,因为时间码在不同解码器下会有半帧的偏差,帧号不会。
LanczosResize放在 TMPGEnc 之前,是因为它内部那次缩放质量和速度都不占优,交给 AviSynth 反而更快也更清楚。AssumeTFF是声明顶场优先,标清交错素材里这个值搞反了,运动画面就会上下抖动。ConvertToRGB24的matrix="rec601"对应标清素材的色度矩阵,这里填rec709会让肤色发青。
还有一个容易忽略的点:AviSynth 从 YV12 转 RGB24 时默认按电视色阶处理,也就是 16–235。如果你的源是电脑色阶(0–255),转完会发灰或者死黑。这时候要在转换前补一句色阶映射,比如ColorYUV(levels="PC->TV"),方向别搞反,否则画面会被压得更糟。这个坑我在老素材上踩过不止一次,预览不仔细看根本发现不了,等刻完盘放到电视上才看出来。
如果DirectShowSource在你的机器上不稳定(装了多个同类解码器容易挑错),可以换AviSource走 VFW,或者上 ffms2。ffms2 在 AviSynth 2.5 上要挑版本,装之前先确认接口对得上,不然会出现“插件加载成功但函数找不到”的情况。
3. 视频参数:模板、码率与 GOP 的实操取值
3.1 模板只是起点,先认清三张规格表
新建项目时会让你选模板,VCD、SVCD、DVD 各一套。选完第一件事是点“Unlock”,不然码率、GOP、量化矩阵全是灰的,只能按模板默认值跑。三套规格的硬性边界大致如下:
| 规格 | 分辨率(NTSC / PAL) | 视频码率 | 音频 | 注意点 |
|---|---|---|---|---|
| VCD | 352×240 / 352×288 | 1150 kbps CBR | MP2 224 kbps 44.1 kHz | 必须恒定码率,峰值超一点有些机器就不认 |
| SVCD | 480×480 / 480×576 | 上限 2520 kbps VBR | MP2 224 kbps 44.1 kHz | 峰值受 VBV 缓冲约束 |
| DVD | 720×480 / 720×576 | 上限 9800 kbps | MP2 / AC3 / PCM | 视频加音频总和不超过 10080 kbps |
| XVCD / KDVD | 自定义 | 自定义 | 自定义 | 能不能播全看目标播放器 |
这张表里最容易被忽略的是最后一列。VCD 那条“必须恒定码率”是硬约束,不是建议,很多老机器的解码芯片只认 1150 kbps 的恒定流,你设成 VBR 它直接罢工或者花屏。DVD 那条总和限制也是硬约束,视频给到 9500、音频再塞个 384 kbps 的 MP2,加起来就超了,authoring 阶段可能报错,也可能勉强通过但播放到高码率片段时卡顿。
3.2 码率控制:CBR、VBR 与 VBV 缓冲的关系
CBR 的优点是文件大小可预测、老设备兼容性最好,缺点是暗场和静态画面在浪费码率,运动场景又不够用。VBR 两遍编码是先分析一遍再分配,画质体积比明显更好,代价是要跑两遍,时间翻倍。
真正决定“能不能播”的是 VBV 缓冲,不是平均码率。VBV 模拟的是解码端缓冲区的大小,它限制的是瞬间峰值能冲多高,而不是整体平均值。VCD 的缓冲很小,所以哪怕你平均码率设成 1150,某个复杂镜头瞬间冲高也会导致解码端缓冲溢出,表现就是那一秒花屏或者卡住。
实际操作里我一般这样取值:目标设备是老 DVD 机,平均码率压到 6000 kbps 左右,最大码率不超过 8000 kbps,VBV 缓冲用 DVD 常见的那档;目标只是电脑播放,平均可以到 8000,最大给到 9000,缓冲放宽一点,画质能明显好一截。VBR 的最大码率不要设成平均值的四五倍,那样等于把 VBV 约束完全作废了。
注意:码率的单位是 kbps 不是 kB/s,差 8 倍。填参数时看错单位,出来体积会离谱到你以为软件坏了。
3.3 GOP 结构:N 值、M 值与封闭 GOP
GOP 是 I 帧、P 帧、B 帧的组合结构。N 值是一个 GOP 的长度,也就是两个 I 帧之间隔多少帧;M 值是 B 帧的间隔。NTSC 常用 N=15、M=3,PAL 常用 N=12、M=3,换算下来都是半秒左右一个 I 帧,这个密度对随机访问和容错都比较平衡。
N 值调大,压缩率上升,因为 I 帧最占码率;但代价是拖动进度条时定位变慢,中间丢一个包影响的范围也更大。N 值调小则相反,码率上去了,抗错能力强。老设备投片这个场景,我一般不动这两个值,保持模板默认,只在码率特别紧张时才把 N 从 15 提到 18。
封闭 GOP 这个选项值得单独说。开启后每个 GOP 不引用前一个 GOP 的帧,好处是任意位置都能作为切入点,剪切和多段拼接不会互相污染,坏处是压缩率略降。如果你后面要做章节拼接、或者在播放器里频繁跳转,开它。如果只是一条完整片子从头放到尾,关掉能省一点码率。
场景变化检测也建议开着。它会在一检测到镜头切换就强制插一个 I 帧,避免切换瞬间的拖影和糊块。不开的话,镜头切换落在 P 帧或 B 帧上,头一两帧会明显发虚。
3.4 量化矩阵与运动搜索:细节和块效应在交锋
量化矩阵决定的是不同频率成分被压缩的力度。默认矩阵在中高码率下没问题,低码率时高频被砍得太狠,就会出现明显的块效应和涂抹感。这时候换一个更“平坦”的矩阵,把高频的量化步长压下来,块效应会减轻,代价是码率上升。
反过来,如果你码率很宽裕,可以用更“陡”的矩阵,把高频保住,画面锐度明显不一样。这个参数在老设备上看不出差别,在新播放器或者大屏上对比才有意义。
DC 精度有 8、9、10 bit 三档。10 bit 对暗部层次的保留最好,渐变天空不容易出现色带,但会增加码率开销。做夜景多的片子,我倾向给到 9 或 10;普通素材 8 bit 够用。
运动搜索范围这个参数,范围越大,运动向量找得越准,码率利用率越高,但编码时间也线性上升。2.54 这个年代的实现谈不上快,范围拉满跑一遍可能要几个小时。我的习惯是先用默认值跑一分钟样片,看看运动场景有没有明显的拖影,没有就不动它。
4. 音频链路:MP2、采样率与多路复用的对齐
4.1 音频这块只有一个选项:MPEG-1 Layer II
TMPGEnc 2.54 的音频编码器就是 MPEG-1 Layer II,也就是常说的 MP2。这不是它偷懒,是那个年代 VCD、SVCD 规范的强制要求。VCD 规定音频必须是 44.1 kHz、224 kbps 的 MP2,SVCD 同样锁在 44.1 kHz。DVD 允许 48 kHz,PAL 制式的 DVD 也支持 MP2。
问题出在源文件上。现在的素材大多是 48 kHz 的 AAC 或者 AC3,直接丢进去,有些版本会强行内部重采样,出来声音发闷或者有轻微爆音;有些版本干脆拒绝,报一个看不懂的错误。我一般不让它内部转,进 TMPGEnc 之前先把音频处理干净。
还有一个隐藏的坑:采样率和视频制式是绑定的。NTSC 的 VCD 音频是 44.1 kHz,如果你给了 48 kHz,多路复用阶段可能不报错,但放到老机器上就是没声音或者刺啦刺啦。这类问题在电脑播放器上完全测不出来,只有插到目标设备上才暴露。
4.2 用 ffmpeg 把音频先处理到位
抽音轨、改采样率、统一声道、粗做一次响度归一,这几步在 ffmpeg 里一条命令能搞定:
# 抽出音轨:统一 44.1kHz、立体声、16bit PCM,顺手做一次响度归一 ffmpeg -i source.mkv -vn -ac 2 -ar 44100 -c:a pcm_s16le \ -af "loudnorm=I=-16:TP=-1.5:LRA=11" audio.wav参数逐个说。-vn是丢掉视频流,只要音频。-ac 2强制立体声,单声道源直接变单声道会让某些播放器识别异常,双声道虽然浪费一点码率但兼容性好。-ar 44100是目标采样率,做 VCD/SVCD 必须是这个值,做 DVD 就改成 48000。-c:a pcm_s16le输出未压缩 WAV,避免二次有损压缩。
loudnorm那串是响度归一,I=-16是目标响度,TP=-1.5是峰值上限,LRA=11是响度范围。老片源经常一段对白小声、一段配乐炸耳,不做归一,编码出来动态范围还是那样,放到电视上还是得一直按遥控器。这一步是可选的,但做过一次之后基本回不去了。
WAV 拿到手再交给 TMPGEnc 编码成 MP2,或者直接在这一步就编好:
# 直接编成 MP2,224kbps / 44.1kHz,和 VCD 规范对齐 ffmpeg -i audio.wav -c:a mp2 -b:a 224k -ar 44100 audio.mp2-b:a 224k是 VCD 的标准值,做 SVCD 也是这个数。做 DVD 可以给到 384k,音质好一档,但记得回去改视频码率,别把总和顶超了。
4.3 多路复用与音画偏移
TMPGEnc 输出的是分离流:一个.m2v视频基本流,一个.mp2音频流。要合成能播的文件,得走它自带的 MPEG Tools,选 Simple Multiplex,把两个流塞进去。
这里唯一需要调的参数是音频延迟,单位毫秒。正值表示音频往后推,负值表示往前提。怎么定这个值?先用播放器把合成好的文件播一遍,找个明显的口型或者敲击声,看差多少。差半拍大概是 40–80 ms 这个量级。填完重新 multiplex 一遍再看,一般一到两次就能对上台。
提示:不要在 TMPGEnc 内部反复试延迟,每次都要重跑一遍 multiplex。先把延迟值记在本子上,凑齐了几种常见源的偏移量,以后同类素材直接套。
另外要说清楚边界:Simple Multiplex 出来的是 MPEG 节目流,不是 DVD-Video 的 VOB 结构。如果你的目标是刻一张能在 DVD 播放机上出菜单的盘,后面还需要 authoring 这一步,生成 IFO、BUP、VOB 一整套文件。那部分不在 2.54 的职责范围内,别指望它一把梭。
5. 避坑与排查:五条较深的经验记录
5.1 源文件打不开,或者只读到第一帧
现象很统一:双击源文件,弹窗说格式不支持;或者能打开,但帧数显示为 1,预览就一张静止图。
原因基本锁定在解码器上。TMPGEnc 走的是 VFW 接口,系统里没有对应的 32 位 VFW 解码器,它就没法解。现代容器(MKV、MP4 里的 H.264)根本没有 VFW 解码器,这是必然打不开。
解决就是绕开它,走 AviSynth 加 VFAPI。先确认 .avs 在播放器里能正常播放,再让 TMPGEnc 通过 VFAPI 读这个脚本。如果连播放器都播不了 .avs,问题在 AviSynth 那一层,去查源码路径写错、解码器缺失、或者 AviSynth 装成了 64 位。
5.2 编码慢到离谱,CPU 占用还上不去
现象是速度只有实时的零点几倍,任务管理器里 CPU 总占用不到 30%,看着像在偷懒。
原因有两个。一是输入链路在做大分辨率到小分辨率的转换,VFAPI 传的是 RGB24 裸帧,1080p 素材每秒几百兆的内存搬运,全耗在这上面。二是 TMPGEnc 2.54 的编码器本身是单线程的,多核机器上就是只有一个核在跑,剩余核心全闲着。
解决:把所有缩放提前到 AviSynth 里做,脚本里LanczosResize到最终目标分辨率,让 TMPGEnc 拿到的就是 720×576 这种正好合适的尺寸。同时关掉编码时的预览窗口,预览的实时渲染也是纯开销。这样改完,速度通常能翻一倍以上。
5.3 输出在老播放器上花屏、绿块或者马赛克
现象是电脑上播完全正常,拷到 U 盘插到老机器上,某几秒出现绿色方块或者整片糊掉。
原因通常是峰值码率冲破了 VBV 缓冲。电脑播放器缓冲大、容错强,超了也能硬解;老机器的解码芯片缓冲就那么大,溢出就花。另一个可能是多路复用阶段音频采样率和视频制式不匹配,导致整个流被判定为不合规。
解决:先把最大码率压下来,VBR 的峰值不超过规格上限的八成,VBV 缓冲按标准值给。然后拿规格检查工具过一遍,确认 profile 和 level 对得上。最后别在电脑上验收,直接拷到目标设备上播,那才是唯一的验收标准。
5.4 音画不同步,越往后偏得越多
现象是开头还能对上,播到十分钟之后明显差半句台词,越往后越严重。
原因是源文件是可变帧率。手机拍摄、录屏、网络下载的素材大量是 VFR,TMPGEnc 按固定帧率去算时间轴,就会累积出偏差,时间越长偏得越多。
解决是在 AviSynth 里强制固定帧率,DirectShowSource的fps参数显式给死,convertfps=false保证不插帧。如果源本身时长和音频对不上,用 ffmpeg 先把音频补齐或者裁到和视频等长,再进编码。累积型偏移靠后期调延迟是救不回来的,只能在输入端解决。
5.5 画面上下颠倒,或者运动画面有横纹
现象分两种:整幅画面上下翻转;或者画面没翻,但只要有横向运动就出现锯齿状横纹,像隔行没处理。
前者是色彩空间或者场序标记出了问题,某些解码器输出的 RGB 是 bottom-up 的,AviSynth 里没纠正就传下去了。后者是交错素材的场序声明反了,AssumeTFF和AssumeBFF搞混,编码器按错的顺序重组场,运动部分就撕裂。
解决:先确认源是不是交错素材,是的话在脚本里明确声明场序,别让编码器猜。整幅翻转就在脚本末尾加FlipVertical()。这两个问题在静态画面上都看不出来,一定要找有横向运动的片段做验证。
6. 验证与替代:几行命令确认码流,以及什么时候该换掉它
编码跑完不等于活干完。我见过太多“电脑上能播就交货”的情况,插到目标设备上才发现问题。验收这一步至少要过三关。
第一关看码流参数对不对。用 ffprobe 扫一遍,重点看 profile、level、码率、帧率和总帧数:
# 看视频流的关键参数,确认 profile/level 和码率没越界 ffprobe -v error -select_streams v:0 \ -show_entries stream=codec_name,profile,level,width,height,r_frame_rate,bit_rate,nb_frames \ -of default=noprint_wrappers=1 out.mpg # 单独确认音频采样率和码率,采样率错了在老设备上就是没声音 ffprobe -v error -select_streams a:0 \ -show_entries stream=codec_name,sample_rate,channels,bit_rate \ -of default=noprint_wrappers=1 out.mpgprofile应该是 Main@Main 这个档,level和你的分辨率码率要对得上。r_frame_rate显示 25/1 或 30000/1001,出现奇怪的小数说明帧率没锁死。nb_frames和你脚本里 Trim 出来的帧数应该一致,对不上就是中间哪一步丢帧了。音频那条主要看sample_rate,44100 和 48000 差一个数字,结果就是有画面没声音。
第二关看结构。用 MediaInfo 这类工具看 GOP 长度、是否有封闭 GOP 标记、VBV 缓冲值。这些在 ffprobe 里不一定全显示,但对老设备兼容性影响很大。
第三关也是最关键的一关:拷到目标设备上实播。找片子里的三个位置——开头、中间一个快速运动镜头、结尾——各看一遍。开头看同步,中间看有没有花屏,结尾看有没有截断。这三处过了,基本就稳了。
至于什么时候该换掉它,我的判断标准很实际。如果你要批量处理几十上百个文件,或者目标是 H.264/H.265,那 2.54 完全不适合,用 ffmpeg 写个脚本循环跑,一条命令搞定,还能并行。只有当目标设备明确要求 MPEG-1/MPEG-2 合规流、并且你需要逐帧地盯着参数调的时候,它才有不可替代的位置——因为那些参数是摊在明面上的,改一个值立刻能看到体积和画质的变化,这种反馈速度在纯命令行工具里反而要绕一圈。
我现在处理任何老设备投片,都会强制走一遍「AviSynth 出脚本 → 播放器验脚本 → TMPGEnc 编一分钟样片 → 拷到目标设备实播」这个流程,哪怕素材看起来再简单。跳过样片直接跑全片,翻车一次重来就是几个小时,这个后悔药不好吃。希望帮到你。
本文还有配套的精品资源,点击获取