python下载m3u8视频_Python 下载m3u8格式的视频
日常中我们在一些网站上看到有意思的电影或者视频,想保存下来,点击下载却发现这是一个以 .m3u8结尾的视频链接。就算我们用手机下载下来,却发现下载后得到的不是一个完整的视频文件,而是一大堆ts结尾的视频文件,整个视频被切割为一个个的几秒的视频文件。这里就使用python实现将视频链接下载为一个完整的mp4视频文件。
1.了解 m3u8 视频链接
m3u8文件其实是 HTTP Live Streaming(缩写为 HLS)协议的部分内容,而 HLS 是一个由苹果公司提出的基于 HTTP 的 流媒体 网络传输协议。
简而言之,HLS 是新一代流媒体传输协议,其基本实现原理为将一个大的媒体文件进行分片,将该分片文件资源路径记录于 m3u8 文件(即 playlist)内,其中附带一些额外描述用于提供给客户端。客户端依据该 m3u8 文件即可获取对应的媒体资源,进行播放。
因此,客户端获取 HLS 流文件,主要就是对 m3u8 文件进行解析操作。
2.解析 m3u8 文件
我们将获取的视频链接在浏览器上打开,会得到一个以 .m3u8 为结尾的文件,使用记事本打开
#EXTM3U
#EXT-X-TARGETDURATION:12
#EXT-X-MEDIA-SEQUENCE:0
#EXTINF:2,
http://play1.cp21.ott.cibntv.net/play.videocache.lecloud.com/ver_00_22_0_0_1_81028_0_0.ts
#EXTINF:3,
http://play1.cp21.ott.cibntv.net/play.videocache.lecloud.com/ver_00_22_1_1_1_113176_81028_0.ts
#EXTINF:5,
http://play1.cp21.ott.cibntv.net/play.videocache.lecloud.com/ver_00_22_2_2_1_248724_194204_0.ts
......
#EXT-X-ENDLIST
第一行 “#EXTM3U” 表明这个一个 m3u8 格式的视频文件,“#EXTINF”后面的一行链接便是每一个视频流的文件地址。如果将链接输入到浏览器中访问,你将得到一个以 .ts 结尾的几秒钟视频文件。这个文件中所有的链接全部请求得到的就是一个完整的视频。
有时候得到的 m3u8 文件不一样,会有一行 “#EXT-X-KEY” ,说明这个视频是经过加密的,需要我们去解密才能得到视频,否则得到的视频文件打开就会报错。
#EXTM3U
#EXT-X-VERSION:3
#EXT-X-TARGETDURATION:2
#EXT-X-MEDIA-SEQUENCE:0
#EXT-X-KEY:METHOD=AES-128,URI="key.key"
#EXTINF:1.668333,
ir7QcW6705000.ts
#EXTINF:0.834167,
ir7QcW6705001.ts
#EXTINF:0.834167,
ir7QcW6705002.ts
这个文件中多了一行 “#EXT-X-KEY” 这个是向客户端表明这个一个加密的视频,加密方式为 AES-128 ,而加密文件是 key.key ,由于这个加密文件和视频链接地址都无前缀,所以他们的链接前缀应该是得到这个m3u8文件的链接,将末尾修改为key文件和视频流名称就可得到完整的链接。
有时候我们得到的 m3u8 文件是这样的
#EXTM3U
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=732000,RESOLUTION=720x480
hls/index.m3u8
我们将第一个链接后改为 http://www.play1.com/hls/index.m3u8 再次访问才能得到像上面格式的文件。这个只是将文件设置为二次访问获取真实地址。
整个文件解析基本完成,现在进行脚本编写,实现下载。
3.Python实现下载流程
这里实现加密视频的下载
首先获取 m3u8 文件并解析
import requests
import re
from Crypto.Cipher import AES
def m3u8(url):
header = {
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36'
}
# requests得到m3u8文件内容
content = requests.get(url,headers=header).text
if "#EXTM3U" not in content:
print("这不是一个m3u8的视频链接!")
return False
if "EXT-X-KEY" not in content:
print("没有加密")
return False
# 使用re正则得到key和视频地址
jiami=re.findall('#EXT-X-KEY:(.*)\n',content)
key=re.findall('URI="(.*)"',jiami[0])
#得到每一个ts视频链接
tslist=re.findall('EXTINF:(.*),\n(.*)\n#',content)
newlist=[]
for i in tslist:
newlist.append(i[1])
# 先获取URL/后的后缀,再替换为空
urlkey=url.split('/')[-1]
url2 = url.replace(urlkey, '') #这里为得到url地址的前面部分,为后面key的链接和视频链接拼接使用
#得到key的链接并请求得到加密的key值
keyurl=url2+key[0]
keycontent= requests.get(keyurl,headers=header).text
#得到每一个完整视频的链接地址
tslisturl=[]
for i in newlist:
tsurl=url2+i
tslisturl.append(tsurl)
#得到解密方法,这里要导入第三方库 pycrypto
#这里有一个问题,安装pycrypto成功后,导入from Crypto.Cipher import AES报错
#找到使用python环境的文件夹,在Lib文件夹下有一个 site-packages 文件夹,里面是我们环境安装的包。
#找到一个crypto文件夹,打开可以看到 Cipher文件夹,此时我们将 crypto文件夹改为 Crypto 即可使用了
cryptor = AES.new(keycontent, AES.MODE_CBC, keycontent)
#for循环获取视频文件
for i in tslisturl:
res = requests.get(i, header)
#使用解密方法解密得到的视频文件
cont=cryptor.decrypt(res.content)
#以追加的形式保存为mp4文件
with open('xx.mp4', 'ab+') as f:
f.write(cont)
return True
if __name__ == '__main__':
url = "https://xxxxxxx/hls/index.m3u8"
pd = m3u8(url)
if pd:
print('视频下载完成!')
至此整个视频文件下载脚本结束。启动脚本等待视频下载完成,即可得到一个完整的 mp4 格式视频文件。
后记
整个脚本实现过程比较粗糙。只是完成视频的分析下载。小伙伴们可以根据自己自行修改优化。这里也是参考不少大佬的博客技术文档,站在大佬的肩上学习实现了这个脚本。感谢大佬们的技术博客分享,向大佬们致敬!
python下载m3u8视频_Python 下载m3u8格式的视频相关推荐
- IjkVideoView播放视频(支持avi格式的视频)
上一篇 Ijkplayer播放视频(支持AVI格式的视频) 讲了,Ijkplayer和SurfaceView结合,播放视频.这一篇我们把Ijkpayer和SurfaceView进行封装,封装成Ij ...
- python下载加密视频_Python下载未加密的m3u8文件(流媒体文件)
很多时候我们用手机浏览器缓存视频时发现缓存下来的文件后缀是.m3u8格式的,按文件目录找过去发现是一个几十K大小的系统不可读的文件,那我们缓存下来的文件去哪儿了呢? 其实.m3u8文件就相当于一个协议 ...
- python使用视频_Python中操作各种多媒体,视频、音频到图片的代码详解
我们经常会遇到一些对于多媒体文件修改的操作,像是对视频文件的操作:视频剪辑.字幕编辑.分离音频.视频音频混流等.又比如对音频文件的操作:音频剪辑,音频格式转换.再比如我们最常用的图片文件,格式转换.各 ...
- python 录制web视频_Python django框架 web端视频加密的实例详解
视频加密流程图: 后端获取保利威的视频播放授权token,提供接口api给前端 参考文档:http://dev.polyv.net/2019/videoproduct/v-api/v-api-play ...
- python调用摄像头录制视频_Python OpenCV使用摄像头捕获视频
我们知道,OpenCV是一款强大的跨平台的计算机视觉库,使用它能完成我们对于图像和视频处理的很多功能,今天,我们使用OpenCV来捕获计算机摄像头的视频. 使用OpenCV捕获摄像头视频 我们知道,视 ...
- python抓取视频_python实现超简单的视频对象提取功能
视频对象提取 与其说是视频对象提取,不如说是视频颜色提取,因为其本质还是使用了OpenCV的HSV颜色物体检测.下面话不多说了,来一起看看详细的介绍吧. HSV介绍 HSV分别代表,色调(H:hue) ...
- 怎么把抖音的视频转成gif格式?视频转gif的具体方法
当我们遇到有趣的视频想做成表情包时,都会在想这些图片是怎么制作的呢?相信有很多小伙伴都有同样的疑问,有哪些视频转gif工具可以把视频改成gif图片呢?GIF中文网的在线视频转gif功能用起来既简单又方 ...
- 电脑视频转换成mp4格式,视频格式转换器转换
怎么把电脑视频转换成mp4格式?使用视频转换器,可以转换来自各种设备的音视频格式,包括相机.手机.视频播放器.电视.平板电脑等.因此,音视频爱好者都可以使用它在各种设备上播放或在社交平台上分享. 主要 ...
- (一) 音视频基础_Mpeg4封装格式音视频编码格式_解封装解码_像素格式_PCM音频-采样率-通道-planar_MP4标准和h264格式的NAL的GOP分析
封装:从文件中把音视频读出来 解码:将音视频解压出来 重采样:将音视频转换成声卡显卡支持的格式,视频需要做像素格式的转换MPEG(或叫MPEG-4)是一套用于音频﹑视频信息压缩的编码标准. MPEG- ...
- python下载m3u8地址_python 下载m3u8视频的示例代码
import requests import os import datetime import threading class xiazai(): def __init__(self,url): s ...
最新文章
- akaze特征匹配怎么去掉不合适的点_SIFT特征点
- [emuch.net]MatrixComputations(1-6)
- GitLab 配置邮箱
- 下列不是python数据类型的是_Python数据类型方法精心整理,不必死记硬背,看看源码一切都有了...
- thinkphp读写mysql的枷锁_thinkphp5 数据库配置读写分离
- 存储过程DataGrid分页及注意点
- ActiveRecord学习笔记(四):处理Many-To-Many映射
- 测试用例又双叒叕失败了,NLP帮你
- Android导出jar包后的资源使用问题
- 二进制数除法 matlab,MATLAB求出不可约多项式(实现二进制加法、除法)
- installshield 安装包失败问题
- 关闭linux终端发出的烦人提示音
- gif透明背景动画_用“万彩动画大师”点亮你的微课
- postgresql 导出单张表
- 服务器在美国怎样网页加速,美国服务器如何优化网站访问速度
- (八)高德地图之添加marker标记点
- 吃饭的时候吃饭,睡觉的时候睡觉。 (转)
- 微信公众号开发 (1) 微信接入认证成为开发者
- 蓝桥杯:三升排序——————Python
- 51nod1635 第K个幸运排列