大工云盘不支持 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