日常中我们在一些网站上看到有意思的电影或者视频,想保存下来,点击下载却发现这是一个以 .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格式的视频相关推荐

  1. IjkVideoView播放视频(支持avi格式的视频)

    上一篇   Ijkplayer播放视频(支持AVI格式的视频) 讲了,Ijkplayer和SurfaceView结合,播放视频.这一篇我们把Ijkpayer和SurfaceView进行封装,封装成Ij ...

  2. python下载加密视频_Python下载未加密的m3u8文件(流媒体文件)

    很多时候我们用手机浏览器缓存视频时发现缓存下来的文件后缀是.m3u8格式的,按文件目录找过去发现是一个几十K大小的系统不可读的文件,那我们缓存下来的文件去哪儿了呢? 其实.m3u8文件就相当于一个协议 ...

  3. python使用视频_Python中操作各种多媒体,视频、音频到图片的代码详解

    我们经常会遇到一些对于多媒体文件修改的操作,像是对视频文件的操作:视频剪辑.字幕编辑.分离音频.视频音频混流等.又比如对音频文件的操作:音频剪辑,音频格式转换.再比如我们最常用的图片文件,格式转换.各 ...

  4. python 录制web视频_Python django框架 web端视频加密的实例详解

    视频加密流程图: 后端获取保利威的视频播放授权token,提供接口api给前端 参考文档:http://dev.polyv.net/2019/videoproduct/v-api/v-api-play ...

  5. python调用摄像头录制视频_Python OpenCV使用摄像头捕获视频

    我们知道,OpenCV是一款强大的跨平台的计算机视觉库,使用它能完成我们对于图像和视频处理的很多功能,今天,我们使用OpenCV来捕获计算机摄像头的视频. 使用OpenCV捕获摄像头视频 我们知道,视 ...

  6. python抓取视频_python实现超简单的视频对象提取功能

    视频对象提取 与其说是视频对象提取,不如说是视频颜色提取,因为其本质还是使用了OpenCV的HSV颜色物体检测.下面话不多说了,来一起看看详细的介绍吧. HSV介绍 HSV分别代表,色调(H:hue) ...

  7. 怎么把抖音的视频转成gif格式?视频转gif的具体方法

    当我们遇到有趣的视频想做成表情包时,都会在想这些图片是怎么制作的呢?相信有很多小伙伴都有同样的疑问,有哪些视频转gif工具可以把视频改成gif图片呢?GIF中文网的在线视频转gif功能用起来既简单又方 ...

  8. 电脑视频转换成mp4格式,视频格式转换器转换

    怎么把电脑视频转换成mp4格式?使用视频转换器,可以转换来自各种设备的音视频格式,包括相机.手机.视频播放器.电视.平板电脑等.因此,音视频爱好者都可以使用它在各种设备上播放或在社交平台上分享. 主要 ...

  9. (一) 音视频基础_Mpeg4封装格式音视频编码格式_解封装解码_像素格式_PCM音频-采样率-通道-planar_MP4标准和h264格式的NAL的GOP分析

    封装:从文件中把音视频读出来 解码:将音视频解压出来 重采样:将音视频转换成声卡显卡支持的格式,视频需要做像素格式的转换MPEG(或叫MPEG-4)是一套用于音频﹑视频信息压缩的编码标准. MPEG- ...

  10. python下载m3u8地址_python 下载m3u8视频的示例代码

    import requests import os import datetime import threading class xiazai(): def __init__(self,url): s ...

最新文章

  1. akaze特征匹配怎么去掉不合适的点_SIFT特征点
  2. [emuch.net]MatrixComputations(1-6)
  3. GitLab 配置邮箱
  4. 下列不是python数据类型的是_Python数据类型方法精心整理,不必死记硬背,看看源码一切都有了...
  5. thinkphp读写mysql的枷锁_thinkphp5 数据库配置读写分离
  6. 存储过程DataGrid分页及注意点
  7. ActiveRecord学习笔记(四):处理Many-To-Many映射
  8. 测试用例又双叒叕失败了,NLP帮你
  9. Android导出jar包后的资源使用问题
  10. 二进制数除法 matlab,MATLAB求出不可约多项式(实现二进制加法、除法)
  11. installshield 安装包失败问题
  12. 关闭linux终端发出的烦人提示音
  13. gif透明背景动画_用“万彩动画大师”点亮你的微课
  14. postgresql 导出单张表
  15. 服务器在美国怎样网页加速,美国服务器如何优化网站访问速度
  16. (八)高德地图之添加marker标记点
  17. 吃饭的时候吃饭,睡觉的时候睡觉。 (转)
  18. 微信公众号开发 (1) 微信接入认证成为开发者
  19. 蓝桥杯:三升排序——————Python
  20. 51nod1635 第K个幸运排列

热门文章

  1. 查看笔记本预装系统的产品密钥
  2. 程序员如何成为别人的男朋友
  3. 一个简单的爬虫例子-天气
  4. DFD图练习(图书管理系统)
  5. 纯前端实现页面的回到顶部和回到底部功能
  6. 【codeforces 760B】Frodo and pillows
  7. 梦幻西游html源码,index.html
  8. 如何解决Worm.Win32.AutoRun.bqn(文件夹改exe病毒)
  9. linux mv文件个数,关于linux:mv一个文件,其中包含Shell脚本中的空格
  10. 一本应届毕业生求职经历+心得小结