一、前言
现在比较常见的视频流媒体,大部分都是 m3u8 格式的,而对于 m3u8 格式的视频而言,如果你下载过,你会发现它就是一个文本文件,大概也就只有几十 kb,从磁盘大小来看,应该也知道它并不是一个直接的视频文件。
而假如我们想要下载对应的视频文件,直接下载 m3u8,当然是达不到目的的,那么本文就来说说,如何直接下载一个网上的 m3u8 文件,保存成一个比较常规的 mp4 文件。
这个在 Windows 下,应该是有现成的工具可以完成,但是 Mac 就没有了,我也没试过 Windows 的工具,有需要自行搜索。
二、下载一个 m3u8
2.1 什么是 m3u8
说到 m3u8 就要先说说 HLS(HTTP Live Streaming)。HLS 是 Apple 公司针对 iPhone、iPod、iTouch 等移动设备,而研发的基于 HTTP 协议的流媒体解决方案。在 HLS 技术中,Web 服务器可以向客户端提供接近实时的音视频流,但是它又是使用的标准的 HTTP 协议。所以基本上,比较大型的点播直播类服务,都是基于 HLS 的。
而该技术的原理,就是将视频文件或者视频流,进行切片(ts文件),并建立索引文件(m3u8),它支持的视频流编码为 H.264,音频流编码为 AAC。
简单来说,基于 HLS 的视频流,会将完整的视频,切割成一个个比较小的视频片段(ts 文件),然后根据协议组合成一个 m3u8 文件。这些比较小的 ts 文件,是可以单独播放的。而视频播放器,拿到 m3u8 文件之后,根据对其内 ts 片段的索引,连续播放不同的视频片段,来达到流畅的播放效果。
2.2 下载的 m3u8 文件
说这些概念都没用,我们来看两个真实的被下载的 m3u8 文件。
这种 m3u8 文件就还是比较清晰的,能看到它一个个的片段。但是需要注意的是,这里的片段,全部是基于域名的相对地址,也就是说,这样一个 m3u8 文件,你丢到播放器里,是无法播放的,但是如果你记录了原始下载这个 m3u8 的链接,它在播放器里是可以正常播放的。
当然,如果你修改这个 m3u8 文件,将它相对路径拼接上域名地址,也是可以达到播放的效果的。
再来看看另外一种 m3u8 文件,它其内的 ts 片段,都是完整地址。
像这种具有完整地址的 ts 片段,哪怕你将它保存成一个本地的文件,播放器依然是可以直接播放的,不过这里本质上依然是在在线播放。
这两中 m3u8 文件,虽然有细微的差别,但是它们都是基于标准的协议。
简单总结一下:
- m3u8 不是视频内容的文件,它占用的磁盘空间非常的小。
- m3u8 文件,如果其内的 ts 片段,是完整地址,则可以保存后播放,否者只能在线播放。
- 播放器播放 m3u8 文件的时候,实际上,还是在线从线上获取的视频流进行播放,所以是存在失效的情况的。
暂时知道这三点就可以了,接下来我们再看如何将一个 m3u8 文件,下载成一个 mp4 视频文件。
三、ffmpeg
好了,不卖关子了,这里下载 m3u8 会需要使用 ffmpeg。
ffmpeg 是一套可以用来记录、转换音视频,并将其转化为流的开源程序,采用 LGPL 或 GPL 协议许可证书,很多大型的音视频软件,内部都是基于 ffmpeg 的。不了解不要紧,总之知道它对操作 ffmpeg 非常的方便。
如果本机上没有,就需要安装了。在 Mac 下,使用 homebrew 下载 ffmpeg 非常的方便。
- brew install ffmpeg
等待安装成功的提示就好了。
如果已经安装的,***也使用 brew 命令确认一下,有以下输出,表示没问题。
工具配置没什么好说的,没安装的可以借助搜索引擎。
配置好 ffmpeg 的环境之后,只需要一行命令,就可以自动下载一个远端的 m3u8 文件,并且以一个 mp4 格式保存。
- ffmpeg -i "m3u8_file_uri" "save_video.mp4"
到此,如果 m3u8 的链接正确可播放,就会开始下载,等待下载完成就可以了,最终会在指定目录下,保存 save_video.mp4 文件,它就是最终我们下载的离线视频文件。
四、you-get
大部分情况下,我们没办法直接获取到 m3u8 的链接,一般通过浏览器的调试工具,或者抓包的方式来获取。
而如果我们只是需要下载一些常见的视频网站的视频的话,Github 上,还有一个开源库,soimort/you-get ,就可以解决你的需求。
它只需要传递一个视频的地址,就会全自动下载。它的原理是去解析视频网站,拿到真实的播放地址,进行下载。而且例如 YouTube 等视频网站,如果有带有字母,能识别的话也会自动识别一同下载,最终以 SubRip 格式保存字母。
而 you-get 依赖 Python 和 ffmpeg 的,所以要提前安装它们。
如果你已经配置好 Pyhone3 的环境,安装 you-get 非常的简单。
- pip3 install you-get
安装之后,就可以通过 you-get 命令进行下载了。
显示的信息还是很完整的,而且有标准的下载进度。跟多细节,可以直接看 Github 上的文档。
- you-get:
- https://github.com/soimort/you-get
如果是比较知名的视频网站,还是推荐使用 you-get ,它本身支持的网站也很多(文档上有支持的标识),基本上做到了一键下载,支持的网站太多了,这里就不一一截图了,基本上国内外的大点的视频网站都有,不过具体哪些能下载,就要具体问题具体分析了。
【本文为51CTO专栏作者“张旸”的原创稿件,转载请通过微信公众号联系作者获取授权】