一种下载 HLS(m3u8) 视频并无压制合并封装为 mp4 的方法 (FFmpeg)
通常情况下,一则 HLS 视频由 .ts 分段和 .m3u8 分段索引构成。本文将介绍一种使用 FFmpeg Tool 实现 HLS 视频下载、无压制合并封装成 mp4 的方法。
ffmpeg -i "http://website/.m3u8" -c:v copy -c:a copy -bsf:a aac_adtstoasc 1.mp4
使用 FFmpeg 以 HLS 视频作为输入(-i "http://website/.m3u8"
), FFmpeg 将自动解析 m3u8 并下载 ts 分段视频,随后复制视频流与音频流(-c:v copy -c:a copy
),重新混流封装成 mp4,并输出到文件1.mp4
。
评论
问个问题,像这种copy方式似乎是不支持用segment 切片的?想把m3u8直播流下载并再次切片为固定时长的话有啥一步到位的方法么
@O:这个问题挺好的,你应该注意到了,这篇博文的“HLS 视频”实际上是指那些已经给出完整的切片列表的定长 HLS 视频流,因而这样下载并合并没有什么大碍。但是对于切片列表动态变化的 HLS 直播流,要实时持续地下载 .ts 切片,目前我个人的做法是使用自己写的一个工具轮询下载来实现,而没有具体地了解是否可以通过 FFmpeg 快捷实现。
据 FFmpeg 的这则邮件讨论(https://lists.ffmpeg.org/pipermail/ffmpeg-user/2018-April/039599.html)来看,FFmpeg 应该不能实现只做下载器,隐式地输出多个 .ts 切片。邮件里还提到可以考虑使用 youtube-dl 工具实现下载 .ts 切片,但我不确定它是否能正确下载直播流;并且 youtube-dl 废弃了有关直播流的一个功能(https://github.com/ytdl-org/youtube-dl/issues/11618#issuecomment-362766566)因而可能需要使用 streamlink 来实现(record 功能),但是 streamlink 目前似乎无法实现多文件(而是合并成单个 .ts)保存。
此外,也有人使用 aria2 来下载 .ts 切片(https://gist.github.com/patrickgill/130bf9eaa76138596137c7234e80f339),我同样不是很清楚它是否能正确地下载直播流。
发表评论