如何使用FFmpeg为HLS播放列表添加字幕?

4

我有一个视频文件(video.mp4)和一个字幕文件(subtitle.srt)。

我想使用FFmpeg生成一个VoD HLS播放列表,其中包含三个不同分辨率的视频,并且我还希望将字幕文件转换为分段的.vtt文件。

我尝试了以下命令,但它无效,没有任何进一步的信息,只显示“Conversion failed!”:

ffmpeg -i video.mp4 -i subtitle.srt \
-preset slow -g 60 -sc_threshold 0 \
-map 0 -map 0 -map 0 -map 1 \
-s:v:0 640x360 -c:v:0 h264 -b:v:0 500k \
-s:v:1 854x480 -c:v:1 h264 -b:v:1 1000k \
-s:v:2 1280x720 -c:v:2 h264 -b:v:2 2000K \
-c:a copy -c:s webvtt \
-f hls -hls_playlist_type vod -var_stream_map "v:0,a:0 v:1,a:1 v:2,a:2" \
-master_pl_name master.m3u8 -hls_time 6 -hls_list_size 0 -hls_allow_cache 1 -start_number 1 \
-hls_segment_filename "output/hls/%v/seg-%d.ts" output/hls/%v/index.m3u8

我在FFmpeg文档或其他地方都找不到关于如何向HLS播放列表添加字幕的有用信息。确切的命令应该是什么样子的?我的命令缺少了什么?


对于未来访问此问题并遇到类似问题的任何人:使用Shaka Packager而不是FFmpeg来完成此任务,它更易于使用,是一个更合理的工具。FFmpeg只会带来纯粹的头痛,我最终选择了Shaka Packager,并且不会再回头使用FFmpeg了。 - aradalvand
你好,你解决了这个命令吗?对我来说,它仍然显示以下内容: [hls @ 000002689df607c0] 在两个不同的变量定义#0和#1中找到了相同的基本流 [hls @ 000002689df607c0] 变量流信息更新失败,状态为ffffffea 无法为输出文件#0编写标头(编解码器参数不正确?):无效参数 初始化输出流0:5时出错-- - jeff
@jeff 很遗憾,我放弃了FFmpeg并开始使用Shaka Packager。请看一下我的先前评论。 - aradalvand
我明白了,无论如何还是谢谢您的回复。顺便说一句,如果您感兴趣,我已经用这个命令使您的工作正常运行: https://www.reddit.com/r/ffmpeg/comments/mfybas/comment/gssvbsg/?utm_source=share&utm_medium=web2x&context=3 我不确定它是否正确。 - jeff
1个回答

3
文档不是很好,但请查看该部分底部的-var_stream_map。您需要添加字幕到相关变体流组的映射。因此,您上面的示例将变为:
-var_stream_map "v:0,a:0,s:0 v:1,a:1,s:0 v:2,a:2,s:0"

如果你愿意的话,可以通过添加,sgroup=examplegroupname来设置字幕组名称。
最后,有一个未记录的选项hls_subtitle_path,它允许你设置字幕清单名称(默认为主m3u8名称加上_vtt.m3u8)。

谢谢。我不知道是谁给你的答案点了踩。很奇怪。他们也给我的问题点了踩。我不知道为什么。无论如何,自从我发了那个问题以来,我一直在尝试使用-var_stream_map,但不仅文档糟糕,错误信息也很难懂。你提到了hls_subtitle_path选项。谢谢。是否还有设置字幕片段名称的选项?它默认为主m3u8文件名+片段编号(例如playlist2.vtt),这不好看。此外,我能在哪里找到未记录的选项列表? - aradalvand
1
很遗憾,对于字幕片段名称,似乎没有应用hls_segment_filename,也没有类似的选项,这看起来是一个疏忽 :-(所有可用选项都可以使用ffmpeg -h muxer=hls显示,尽管某些选项的文档不是很好。如果您能理解C语言,那么https://github.com/FFmpeg/FFmpeg/blob/master/libavformat/hlsenc.c上的源代码会很有帮助。 - Anonymous Coward
@AnonymousCoward 哦,真遗憾!但是非常感谢你的帮助。非常感激。 - aradalvand

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