FFmpeg 正在打印两个字符之间的未知字形,但奇怪的是,它并没有替换字体中不存在的字符,而只是打印了一个新的未知字形,我不明白为什么。
x=src.mkv
y=src.srt
format=mkv
out=out
mkdir $out
speak=ffmpeg finished
params="-preset fast -crf 25"
ffmpeg -i "$x" -to 00:15:35 $params -vf "subtitles=$y" $out/1.$format ; espeak "$speak"
srt 文件采用 utf-8 编码。但我尝试为 FFmpeg 指定字幕编码和不同的字体,但无济于事:
ffmpeg -i "$x" -to 00:15:35 $params -vf "subtitles=$y:force_style='FontName=B Nazanin':charenc='utf-8'" $out/1.$format ; espeak "$speak"
我最后想到的办法是尝试将.srt
字幕转换为.ass
格式,但这也无济于事。
我正在使用最新的 FFmpeg:
ffmpeg version 6.0-full_build-www.gyan.dev Copyright (c) 2000-2023 the FFmpeg developers
built with gcc 12.2.0 (Rev10, Built by MSYS2 project)
我尝试使用 HandBrake 刻录字幕,并附带.ass
字幕,只是想看看它是否会打印未知的字形,但事实并非如此!我还应该注意,这是一个非常旧的版本 (1.1.1 2018061800),我认为 HandBrake 很可能在内部使用 FFmpeg,因此 HandBrake 应该使用一个参数来防止出现此问题。
这是 FFmpeg 打印未知字形的字幕行的示例:
1
00:00:00,000 --> 00:01:00,000
اگه بتونم کلانتر رو قانع کنم...
要重现此问题,您可以按照以下步骤操作:
创建一个名为的字幕文件sub.srt
,并将上面的字幕行粘贴到文件中。
使用 Imagemagick 制作静止图像:
convert -size 1280x720 xc:gray +noise gaussian jpg: | convert -define jpeg:extent=400kb - image.jpg
现在使用此命令,将字幕刻录到新视频中:
ffmpeg -loop 1 -i image.jpg -c:v libx264 -tune stillimage -pix_fmt yuv420p -shortest -preset fast -crf 25 -vf "subtitles=sub.srt" -to 00:01:00 out.mp4