使用FFmpeg嵌入带定位格式的SRT到MP4时丢失格式,能否实现保留?
保留SRT字幕定位格式嵌入MP4的FFmpeg方案
问题根源
默认情况下,FFmpeg将SRT嵌入MP4时使用mov_text编码器,该编码器仅支持基础字幕文本,无法识别SRT中的定位(如{\pos(x,y)})、对齐(如{\anN})等扩展格式属性,导致格式丢失。要保留这些属性,需选择支持样式的字幕编码器和格式。
解决方案1:嵌入软字幕(保留可开关性)
通过将SRT转换为ASS格式(原生支持丰富样式与定位),再嵌入MP4,步骤如下:
转换SRT到ASS
ffmpeg -i input.srt input.ass
FFmpeg会自动识别SRT中的定位、对齐标记并转换为ASS格式的对应属性。将ASS字幕嵌入MP4
ffmpeg -i input.mp4 -i input.ass -c:v copy -c:a copy -c:s ass -metadata:s:s:0 language=chi output.mp4
参数说明:
-c:v copy/-c:a copy:直接复制音视频流,避免重新编码耗时-c:s ass:使用ASS编码器处理字幕,完整保留定位与样式-metadata:s:s:0 language=chi:可选,设置字幕语言为中文
解决方案2:硬编码字幕(所有播放器兼容)
若需确保所有播放器都能显示定位格式,可将字幕直接绘制到视频画面(硬编码):ffmpeg -i input.mp4 -vf "subtitles=input.srt" -c:a copy output_hard.mp4
- 若需自定义字体、大小等,可添加
force_style参数:ffmpeg -i input.mp4 -vf "subtitles=input.srt:force_style='FontName=微软雅黑,FontSize=24'" -c:a copy output_hard.mp4
硬编码后的字幕无法关闭,但格式会永久保留。
注意事项
- 确保SRT中的定位标记为标准格式,如
{\pos(150,300)}(指定坐标)或{\an8}(右上对齐),FFmpeg才能正确解析 - 部分旧版播放器可能不支持MP4中的ASS软字幕轨道,此时优先选择硬编码方案
内容的提问来源于stack exchange,提问作者Dzseti
相关产品推荐
相关产品推荐

