如何使用 ffmpeg 将 mp4 转换为 HLS 并将字幕添加到主播放列表

lig*_*t01 8 ffmpeg

我正在尝试ffmpegmp4文件转换HLSmaster playlist.

我设法让它创建index_vtt.m3u8包含字幕的文件,但它不想将流添加到master playlist. 我是新手,所以我不完全理解整个 ffmpeg 是如何工作的(我主要只是尝试我在网上找到的一堆资源)

我正在使用以下命令:

../ffmpeg-4.2.1/ffmpeg -i ../input.mp4 -i ../subtitile.vtt -c:s webvtt -profile:v baseline -level 21 -s 1280x720 -start_number 0 -hls_playlist_type vod -hls_time 10 -hls_list_size 3 -f hls -master_pl_name master.m3u8 index.m3u8`
Run Code Online (Sandbox Code Playgroud)

它产生 master.m3u8

#EXTM3U
#EXT-X-VERSION:3
#EXT-X-STREAM-INF:BANDWIDTH=140800,RESOLUTION=1280x720,CODECS="avc1.42c015,mp4a.40.2"
index.m3u8
Run Code Online (Sandbox Code Playgroud)

我可以在 vlc 中播放它,但它无法识别任何字幕。然后我修改master.m3u8它看起来像这样:

#EXTM3U
#EXT-X-VERSION:6

#EXT-X-MEDIA:TYPE=SUBTITLES,URI="index_vtt.m3u8",GROUP-ID="default-text-group",LANGUAGE="hr",NAME="Croatian",AUTOSELECT=YES

#EXT-X-STREAM-INF:BANDWIDTH=140800,RESOLUTION=1280x720,CODECS="avc1.42c01e,mp4a.40.2",SUBTITLES="default-text-group"
index.m3u8
Run Code Online (Sandbox Code Playgroud)

一切都很好。我怎么能告诉ffmpeg我为我做这件事?

小智 -1

我认为您需要使用-hls_flags选项来single_file确保字幕包含在单个.vtt文件中,并且您还需要指定-var_stream_map将视频、音频和字幕流映射到 HLS 播放列表的选项。

看这个例子:

../ffmpeg-4.2.1/ffmpeg \
-i ../input.mp4 \
-i ../subtitile.vtt \
-c:v copy \
-c:a copy \
-c:s webvtt \
-profile:v baseline \
-level 21 \
-s 1280x720 \
-start_number 0 \
-hls_playlist_type vod \
-hls_time 10 \
-hls_list_size 0 \
-hls_flags single_file \
-var_stream_map "v:0,a:0,s:0" \
-master_pl_name master.m3u8 \
-f hls index.m3u8
Run Code Online (Sandbox Code Playgroud)

解释如下:

  1. -c:v copy添加并-c:a copy确保视频和音频仅被复制而无需重新编码。

  2. -var_stream_map用于将视频、音频和字幕流映射到 HLS 播放列表。

  3. -hls_list_size 0确保所有片段都包含在播放列表中。

  4. -hls_flags single_file确保字幕包含在单个.vtt文件中。

我认为此命令会生成必要的主播放列表(master.m3u8),其中包括字幕,类似于您手动编辑的内容。