【问题标题】:How to convert video to hls with selected audio streams?如何使用选定的音频流将视频转换为 hls?
【发布时间】:2021-11-25 12:19:32
【问题描述】:

我正在尝试将一些具有多个音频流的视频(不同格式,例如 mp4、mkv、avi)转换为只有一个音频的 HLS。我用 ffmpeg 尝试了不同的解决方案,但似乎没有一个是理想的。

例如,this gist 中的 ffmpeg -i in.mkv -codec: copy -f hls out.m3u8 仅在 in.mkv 有一个音频流时才有效(至少这是我的理解)。

然后我试过了:

ffmpeg -i in.mkv -map 0:v:0 -map -0:a:0 -c copy -f hls out.m3u8

我不确定为什么此解决方案不起作用,但取决于播放器和输入文件,视频播放不正确(例如,hls.js 缺少图像仅被偶尔的声音包围)。

我的下一个想法是首先将in.mkv 转换为in_tmp.mkv,只使用一个音频流,然后使用上面的要点:

ffmpeg -i in.mkv -map 0:v:0 -map -0:a:0 -c copy in_tmp.mkv
ffmpeg -i in_tmp.mkv -c copy -f hls out.m3u8

但结果与我之前的尝试相同。我的猜测是-c copy 有问题(但坦率地说,我不太明白我在做什么)。

所以我最终将filter_complexconcat 一起使用:

  ffmpeg -i in.mkv -filter_complex '[0:v:0][0:a:0] concat=n=1:v=1:a=1 [v] [a]' -map '[v]' -map '[a]' -f hls out.m3u8

看起来它可以正常工作,而且我尝试过的不同播放器都能正确播放输出视频,但当然感觉不是最理想的:这需要很多时间,而且concat 的使用似乎很不自然。

所以问题是如何将视频转换为 HLS,只有一个选定的音频流,有或没有 ffmpeg?

【问题讨论】:

    标签: video ffmpeg http-live-streaming hls.js


    【解决方案1】:

    如何将视频转换为只有一个选定音频流的 HLS?

    最基本的命令:

    ffmpeg -i input.mkv -c copy -f hls output.m3u8
    

    这将使用默认的stream selection 行为,该行为将为每种流类型选择一个流。

    或使用-map 手动选择所需的流。此示例将选择所有视频流,如果存在音频,则可选择选择音频流 #3(注意索引从 0 开始计数):

    ffmpeg -i input.mkv -c copy -map 0:v -map 0:a:3? -f hls output.m3u8
    

    带有-map -0:a:0 的命令是一个否定映射,它将排除流0:a:0

    有关许多示例和更多信息,请参阅 FFmpeg Wiki: Map

    【讨论】:

      猜你喜欢
      • 2017-07-04
      • 2020-03-09
      • 2020-08-25
      • 2021-04-08
      • 2016-08-22
      • 2016-01-31
      • 1970-01-01
      • 2017-10-17
      • 1970-01-01
      相关资源
      最近更新 更多