ffmpeg 在 utf-8 字幕上的字符之间打印未知字形

ffmpeg 在 utf-8 字幕上的字符之间打印未知字形

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

相关内容