使用 ffmpeg 将 MP4 转换为具有多个字幕轨道的 m3u8

Converting MP4 into m3u8 with multiple subtitle tracks using ffmpeg

我目前正在开发一个视频管道,它将接收一个 mp4 文件和 n 个 webvtt 文件,并输出一个带有可选字幕轨道的 m3u8 文件,我在找出正确的咒语时遇到了一些困难ffmpeg.

以下是我现在正在使用的命令,在将其集成到我的项目之前测试所有内容:

ffmpeg -i sample.mp4 -i sample-vtt-en.vtt -i sample-vtt-es.vtt \
  -map 0:v -map 0:a -map 1 -map 2 \
  -c:v copy -c:a copy -c:s webvtt \
  -metadata:s:s:0 language=en \
  -metadata:s:s:1 language=es \
  -start_number 0 -hls_time 10 -hls_list_size 0 -f hls \
  -master_pl_name master.m3u8 \
  out/sample.m3u8

当运行如上时,出现如下错误

[webvtt @ 0x7fb6c6075a00] Exactly one WebVTT stream is needed.
Could not write header for output file #0 (incorrect codec parameters ?): Invalid argument
Error initializing output stream 0:3 --
Stream mapping:
  Stream #0:0 -> #0:0 (copy)
  Stream #0:1 -> #0:1 (copy)
  Stream #1:0 -> #0:2 (webvtt (native) -> webvtt (native))
  Stream #2:0 -> #0:3 (webvtt (native) -> webvtt (native))
    Last message repeated 1 times

此外,当我使用单个 webvtt 文件处理它时,它不会出错,但输出不太正确。最大的问题是主播放列表不包含任何字幕信息并且无法识别任何曲目。 sample.m3u8 播放列表似乎确实了解字幕轨道,但它们以各种奇怪的方式分割。

有人可以帮助我完成我正在努力完成的事情吗?

看来 HLS muxer 目前不允许仅包含字幕的变体流。我不使用 HLS,因此您需要进一步调查以防我错了,或者如果您将来是 reader,情况可能会发生变化。

次优解决方法是使用 -var_stream_map HLS 混合器选项将音频添加到变体流。类似于:

ffmpeg -i sample.mp4 -i sample-vtt-en.vtt -i sample-vtt-es.vtt \
  -map 0:v -map 0:a -map 0:a -map 1 -map 2 \
  -c:v copy -c:a copy -c:s webvtt \
  -metadata:s:s:0 language=en \
  -metadata:s:s:1 language=es \
  -start_number 0 -hls_time 10 -hls_list_size 0 -f hls \
  -var_stream_map "v:0,name:video a:0,s:0,language:eng,name:english a:1,s:1,language:spa,name:espanol"
  -master_pl_name master.m3u8 \
  out/sample.m3u8