大工云盘不支持 MKV 等不适合流式传输的视频格式文件的在线播放。不巧的是,我手里的番剧资源都是 MKV 格式的。后来尝试了多种方法试图保留内嵌字幕转格式到 MP4,手动分离、小丸工具箱、格式工厂等等都试过了,不是丢字幕就是丢字体格式,要么干脆视频格式转都转不过去。

后来用 FFmpeg 压制成硬字幕,解决了这个问题。步骤如下(FFmpeg 如何安装就不赘述了):

命令行要 cd 到视频文件所在目录,然后

ffmpeg -i input.mkv -vf subtitles=input.mkv output.mp4

其中,input.mkv 为输入文件名,output.mp4 为输出文件名。

当然批量转也行,写个 bat 脚本:

@echo off
for %%f in (*.mkv) do (
    ffmpeg -i "%%f" -vf "subtitles='%%f'" "%%~nf.mp4"
)
pause

把脚本放到视频所在文件夹,启动脚本就会自动转换当前目录所有 MKV 文件为带硬字幕的 MP4 视频,不过耗时略长,取决于电脑性能。

转换效果良好:

但是,如果 MKV 视频文件内置多个不同字幕流(比如多个不同语种,挺常见的情况),直接压制可能导致出错。可以先查看 MKV 文件中的字幕流编号:

ffmpeg -i input.mkv

就会得到类似这样的结果:

如果要得到带简中字幕的视频,就可以这么做:

ffmpeg -i input.mkv -vf "subtitles=input.mkv:si=2" -c:a copy output.mp4

这时,si=2 表示选择第 3 个字幕流作为硬编码字幕。(计算机从 0 开始数。不是 si=5 是因为 Stream 0、1、2 都不算字幕流,计数时从第 1 个字幕流开始算)

如果是带外挂 ASS 字幕的 MKV 视频文件,也可以通过脚本批量压制为 MP4(假定视频和字幕文件名相同且在同一目录下):

@echo off
chcp 65001 >nul
setlocal enabledelayedexpansion

for %%f in (*.mkv) do (
    set "input=%%f"
    set "basename=%%~nf"
    set "subtitle=%%~nf.ass"
    set "output=%%~nf.mp4"

    if exist "!subtitle!" (
        echo 正在处理: "!input!" 与 "!subtitle!"
        ffmpeg -i "!input!" -vf "subtitles='!subtitle!'" -c:v libx264 -crf 18 -preset slow -c:a copy -movflags +faststart "!output!"
    ) else (
        echo 找不到字幕文件: "!subtitle!",跳过。
    )
)

echo 全部处理完成!
pause