日常中我们在一些网站上看到有意思的电影或者视频,想保存下来,点击下载却发现这是一个以 .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. WCF 第五章 会话级别的实例
  2. STL标准库六大组件
  3. 微信公众号中的消息类型
  4. 2015年第四季度全球闪存行业营收同比减少5%
  5. String,StringBuffer,StringBuilder的区别
  6. IPv6域名解析服务基础
  7. 学习笔记1-Linux1
  8. oracle oci.dll的作用,ASP.NET bin目录中的Oracle oci.dll无法删除/不起作用
  9. 90后女博士任985高校特聘教授,这次有点不一样
  10. 【模板/经典题型】并查集维护生成树
  11. 字节跳动正测试元宇宙社交APP“派岛”
  12. java方法被编译器调用_我异常了,快来捕获我,Java异常简述
  13. SP1812 LCS2 - Longest Common Substring II
  14. 最新中国数据中心排行榜
  15. 关于peer‘s certificate issuer is not recognized问题的解决方法
  16. C语言求n的阶乘(n!)
  17. 讯飞语音合成 下载音频Java Demo
  18. Multiplayer Moo
  19. 511遇见易语言程序集模块和类模块的区别
  20. 从“消息队列”到“服务总线”和“流处理平台”

热门文章

  1. 相似矩阵和相似对角化
  2. 让TQ2440也用上设备树 (device tree 操作实例3_重要,对于移植很有参考价值_code)
  3. 移动web网页开发——动画
  4. 2.10 MapReduce文件合并
  5. Java 简单的新增方法
  6. 科研狗的英语翻译小众软件
  7. 如何使用微软提供的TCHAR.H头文件
  8. Cuba在Linux(Ubuntu)的安装
  9. 以太网交换机和路由器的区别(转载)
  10. 1068 万绿丛中一点红