You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

FFmpeg叠加Teletext图文电视字幕时丢失、显示异常的问题排查及正确实现方法

FFmpeg叠加Teletext图文电视字幕时丢失、显示异常的问题排查及正确实现方法

我完全理解你的需求——保留Teletext字幕原生的排版对齐,不想转成SRT这类格式丢失细节,而FFmpeg里出现的字幕丢失、停留异常,核心原因大概率是你直接处理了未渲染的Teletext原始数据流,而非像VLC那样调用zvbi正确渲染成图像,再加上滤镜链同步设置的小问题。下面一步步帮你解决:

一、先搞清楚核心问题:Teletext流不是现成的字幕图像

你的原始命令里[0:s]指向的是TS里的dvb_teletext原始数据流,这不是已经渲染好的字幕位图。FFmpeg直接对它做scale和overlay时,无法像VLC那样自动调用zvbi解析渲染,自然会出现丢帧、时序错误。

二、正确的实现方式:用FFmpeg的teletext滤镜渲染字幕

FFmpeg内置了teletext滤镜,专门调用zvbi来解析渲染Teletext页面,和VLC的处理逻辑一致,能完美保留原始排版。试试这个命令:

ffmpeg -i test.ts -filter_complex \
  "teletext=page=888:format=rgb24,scale=1920:1080[subs]; \
   [0:v][subs]overlay=shortest=1:eof_action=pass[v]" \
  -map "[v]" -map 0:a -c:a copy output.ts

这里的关键参数逐个解释:

  • teletext=page=888:指定要提取渲染的目标Teletext页面
  • format=rgb24:设置渲染后的字幕图像格式,保证和视频流的色彩空间兼容,避免渲染异常
  • scale=1920:1080:将渲染好的字幕画面缩放到和你的输出视频一致的分辨率,确保叠加位置准确
  • overlay=shortest=1:强制叠加滤镜跟随主视频流结束而停止,解决字幕在视频结束后仍停留的问题
  • eof_action=pass:当字幕流提前结束时,让视频流正常输出,避免中断

三、额外排查点:确保选中正确的Teletext流

如果上面的命令还是有问题,先确认你的TS文件里的Teletext流索引:

ffmpeg -i test.ts

输出里找类似这样的行:

Stream #0:2[0x100]: Subtitle: dvb_teletext (eng) ([6][0][0][0] / 0x0006)

如果Teletext不是默认的字幕流,需要在teletext滤镜里指定输入流(比如流索引是2的话):

ffmpeg -i test.ts -filter_complex \
  "[0:s:2]teletext=page=888:format=rgb24,scale=1920:1080[subs]; \
   [0:v][subs]overlay=shortest=1:eof_action=pass[v]" \
  -map "[v]" -map 0:a -c:a copy output.ts

四、解决字幕停留/时序问题的补充设置

如果还有字幕停留时间不对的情况,可以尝试给teletext滤镜加上fps参数,强制字幕帧率和视频一致(比如视频是25fps):

teletext=page=888:format=rgb24,fps=25,scale=1920:1080[subs]

这样能确保字幕帧和视频帧严格同步,避免时序错位。

备注:内容来源于stack exchange,提问作者O Tal Antiquado

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.15 12:15:32