【发布时间】: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_complex 与concat 一起使用:
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