在将视频转换为HLS格式时,使用FFmpeg烧录的字幕与音频不同步。

4

我有一个带有字幕的文件,它们已经完美地同步了。

这是文件。https://983yqbz442.s3.amazonaws.com/little-mermaid-captions.mp4

我运行这个命令进行转换为hls格式,它将创建.ts文件和.vtt文件。

ffmpeg -i little-mermaid-captions.mp4 -profile:v baseline -level 3.0 -s 640x360 -start_number 0 -hls_time 10 -hls_list_size 0 -f hls index.m3u8

我随后在同一文件夹中创建一个名为master.m3u8的文件,其内容如下。
#EXTM3U
#EXT-X-VERSION:3
#EXT-X-INDEPENDENT-SEGMENTS
#EXT-X-STREAM-INF:BANDWIDTH=800000,RESOLUTION=640x360,SUBTITLES="subtitles"
index.m3u8
#EXT-X-MEDIA:TYPE=SUBTITLES,GROUP-ID="subtitles",NAME="English",DEFAULT=YES,AUTOSELECT=YES,FORCED=NO,LANGUAGE="ENG",URI="index_vtt.m3u8"

现在如果我播放master.m3u8文件,字幕就会失步,快了大约1秒。我知道这可能是我在FFmpeg中漏掉的设置,但我真的卡在这里了,希望能得到任何见解。
谢谢。
更多信息。
这是一个链接到直接.m3u8文件的链接,可以在Safari中打开。

https://983yqbz442.s3.amazonaws.com/hlstests/master.m3u8

生成的vtt文件在这里。

https://983yqbz442.s3.amazonaws.com/hlstests/subs-0.vtt

如果您查看.vtt文件的开头,您会看到这个。
WEBVTT

00:06.840 --> 00:10.320
once long ago in the deep blue below

它应该从00:06.840开始,但在Safari中播放.m3u8文件时,您应该看到它从大约5秒开始,而不是6秒,提前了约1秒钟。

我使用你的命令行将你的mp4转换为HLS格式。我在Chrome、Edge中使用HLS.js播放了HLS视频,在VLC中播放了mp4视频。字幕在这三种情况下都非常准确,这可能是播放器问题。你用什么播放器进行播放? - Markus Schumann
嗨,@MarkusSchumann,感谢提供的信息,我已经更新了答案并添加了更多信息。如果您在Quicktime中播放下载的.mp4文件,您将看到正确的时间轴。 - user1503606
1个回答

6

由于某些原因,在写入时,FFMPEG会在MPEG-2传输流的呈现时间上添加约1.4秒延迟,导致您的视频和音频偏后。 如果在FFMPEG命令行中添加-muxdelay 0,同步问题应该就可以解决。


非常感谢您的帮助,我真的很感激。这对我来说是救命稻草,让我感到非常疯狂 ;) - user1503606
不用谢。这绝对是一个有趣的问题。我想知道为什么 FFMPEG 默认会添加一个呈现时间(PTS)偏移量。Microsoft Edge 原生播放存在不同步的问题,而 hls.js 则可以忽略PTS偏移而保持同步。祝你的项目顺利。 - Markus Schumann

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接