写在前面
最近网上冲浪时,看到些好玩的视频想下载,然后发现是m3u8格式的,于是便记录一下这种比较流行的视频格式的下载。
M3U8
由于音视频这种多媒体文件本身很大,单次完成加载很不现实,所以需要把视频分割成不同的小段来多次加载,(也就是缓冲)。这种技术用到了HLS,是一种流媒体传输协议和技术,而M3U8文件描述了HLS流的结构。
下面是一个M3U8的文件示例:
http://test.com/video_1.ts
http://test.com/video_2.ts
http://test.com/video_3.ts
...
-
EXTM3U: 是m3u8文件声明
-
EXT-X-VERSION: m3u8文件版本
-
EXT-X-TARGETDURATION: 指定每个分段视频的最大持续时间(以秒为单位)。
-
EXT-X-MEDIA-SEQUENCE: 指定第一个分段的序列号。
-
EXTINF: 指定下一个分段的持续时间和其他信息
再后面跟着的url就是分段视频的地址。
下载M3U8格式视频
那么就可以知道,要自己实现下载,只需要把所有的分段视频下载下来,然后给合并到一起就可以了。这里我用python实现个简单的demo,直接上代码
import requests
import os
import subprocess
# 获取M3U8文件
m3u8_url = "http://test.com/video.m3u8"
m3u8_response = requests.get(m3u8_url)
m3u8_content = m3u8_response.text
# 下载分段视频文件
segment_links = [line.strip() for line in m3u8_content.split('n') if line.startswith('http')]
for i, segment_link in enumerate(segment_links):
response = requests.get(segment_link)
with open(f'segment_{i}.ts', 'wb') as segment_file:
segment_file.write(response.content)
# 合并分段视频文件
ts_files = [f"segment_{i}.ts" for i in range(len(segment_links))]
merge_command = f'ffmpeg -i "concat:{"|".join(ts_files)}" -c copy output.mp4'
subprocess.call(merge_command, shell=True)
# 清理临时文件
for ts_file in ts_files:
os.remove(ts_file)
注释中已经写得很清楚了,并没有难度。说一下的是合并视频的时候,用到了ffmpeg这个神器,需要提前安装好这个工具。
写在最后
理论理解了之后,就不要重复造轮子了。m3u8这种技术很早之前就有了,所以早就有大佬搞好了下载工具了,github上随便一找都是。本篇文章只是简单记录一下。
原文始发于微信公众号(飞羽技术工坊):如何下载m3u8视频
- 左青龙
- 微信扫一扫
- 右白虎
- 微信扫一扫
评论