如何下载完整的HLS流视频

2020-11-12 10:45:52 浏览数 (1)

需要从某网页下载一个视频文件,查看之后发现视频文件是用HLS视频流的,HLS全称Http Live Streaming,是由Apple公司定义的用于实时流传输的协议,HLS基于HTTP协议实现,传输内容包括两部分,一部分是m3u8描述文件,另一部分是ts媒体文件

HLS通过将整条流切割成多个小的可以通过HTTP下载的媒体文件,然后客户端通过顺序拉取这些媒体文件播放,来实现看上去是播放一整条流的效果

由于切割成多个小的流片段,所以可以很方便的利用CDN进行分发加速,目前在点播、直播领域大多使用HLS

打开开发者工具,点击播放视频就可以在NetWork中看到

先看下m3u8描述文件

通过wget或curl将文件下载后,通过文本方式可以打开查看

m3u8文件中主要是一个Media Playlist,里面包含一些URI和描述性的tags,比如上面的文件中描述了整个流的ts文件的播放顺序

ts文件就是切分的流文件,视频编码主要格式是h264/mpeg4,音频为acc/MP3,主要分三层:ts层Transport Stream、pes层Packet Elemental Stream、es层Elementary Stream,es层就是音视频数据,pes层是在音视频数据上加了时间戳等对数据帧的说明信息,ts层就是在pes层加入数据流的识别和传输必须的信息

想要获取一个网站的视频,需要将视频完整播放一次,然后从开发者工具中获取m3u8文件和所有的ts文件地址,通过wget或curl将文件下载到本地

因为m3u8文件里面是URI,所以ts文件要放到对应m3u8中描述的位置,比如我上面的是需要将ts文件和m3u8文件同目录

通常情况下ts文件地址都是通过数字编码标识的如下

所以简单可以写个for循环,把所有的ts文件都下载到本地

下载完成后,就可以通过ffmpeg,将ts文件合并为mp4,命令如下:

ffmpeg -i DOD_108040913-512x288-442k-hls.m3u8 -vcodec copy -acodec copy -absf aac_adtstoasc DOD_108040913-512x288-442k-hls.mp4

合并输出如下:

最终会在该目录下生成一个完整的mp4文件

注意下载ts文件的时候,要和m3u8文件的分辨率对应

0 人点赞