m3u8是苹果公司推出的视频播放标准,是m3u的一种,只是编码格式采用的是UTF-8。
m3u8准确来说是一种索引文件,使用m3u8文件实际上是通过它来解析对应的放在服务器上的视频网络地址,从而实现在线播放。使用m3u8格式文件主要因为可以实现多码率视频的适配,视频网站可以根据用户的网络带宽情况,自动为客户端匹配一个合适的码率文件进行播放,从而保证视频的流畅度。
它将视频切割成一小段一小段的ts格式的视频文件,然后存在服务器中(现在为了减少I/o访问次数,一般存在服务器的内存中),通过m3u8解析出来路径,然后去请求。
二. 如何处理经过AES-128加密的ts文件
示例链接:
https://cdn.letv-cdn.com/2018/12/05/JOCeEEUuoteFrjCg/playlist.m3u8
输入这个链接并不会跳转到源播放地址,而是下载一个.m3u8格式的文件,文件内容一般长这样:
#EXTM3U
#EXT-X-VERSION:3
#EXT-X-MEDIA-SEQUENCE:0
#EXT-X-ALLOW-CACHE:YES
#EXT-X-TARGETDURATION:15
#EXT-X-KEY:METHOD=AES-128,URI="key.key"
#EXTINF:6.756756,
out000.ts
#EXTINF:10.427089,
out001.ts
#EXTINF:3.378378,
out002.ts
#EXTINF:1.126133,
.............
out.....ts
将文件中的url中的
playlist.m3u8
替换为 out000.ts会下载一个.ts文件,这个ts文件就是视频的一个片段,整个视频由若干个小片段构成,没有经过加密的文件下载后直接可以播放,但经过AES-128加密后的文件下载后会无法播放
我们主要研究的是经过加密的ts文件,并解密它。我们去把 index.m3u8 替换成 key.key,即可获取到加密的密钥,这个密钥 key 将会是我们后续解码文件的关键,没了它下载得到的文件是没有意义的。
因为需要解码 AES-128 这种加密方式需要用到特殊的模块 AES,所以我们要去安装 Crypto,按照如下的方法导入类来使用。可以通过 pip install Crypto 安装 Crypto库,如果发生了 ImportError,显示没有 Crypro 库,那么就去 site-packages 里面看看文件名是不是
crypto
,改成 Crypto 应该就没问题了。
下载后的ts文件我们可以使用win自带的 copy /b '下载的文件目录路径'/*.ts ' '合并后的文件目录路径'/new.mp4 来合并ts文件,之后再使用 del *.ts 命令来删除所有的.ts文件,在python中我们可以使用os.system()命令来处理cmd命令
具体代码如下
:包括未加密和加密两种处理方式
import requests
import os
from Crypto.Cipher import AES
def m3u8(url):
base_url = url[:url.rfind('/')+1]#如果需要拼接url,则启用 , +1 把 / 加上
headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36'}
rs = requests.get(url,headers=headers).text
list_content = rs.split('\n')
player_list = []
#如果没有merge文件夹则新建merge文件夹,用于存放ts文件
if not os.path.exists('merge'):
os.system('mkdir merge')
key = ''
for index,line in enumerate(list_content):
# 判断视频是否经过AES-128加密
if "#EXT-X-KEY" in line:
method_pos = line.find("METHOD")
comma_pos = line.find(",")
method = line[method_pos:comma_pos].split('=')[1]#获取加密方式
print("Decode Method:", method)
uri_pos = line.find("URI")
quotation_mark_pos = line.rfind('"')
key_path = line[uri_pos:quotation_mark_pos].split('"')[1]
key_url = key_path
res = requests.get(key_url)
key = res.content #获取加密密钥
print("key:", key)
#以下拼接方式可能会根据自己的需求进行改动
if '#EXTINF' in line:
# href = ''
# 如果加密,直接提取每一级的.ts文件链接地址
if 'http' in list_content[index + 1]:
href = list_content[index + 1]
player_list.append(href)
# 如果没有加密,构造出url链接
elif('ad0.ts' not in list_content[index + 1]):
href = base_url + list_content[index+1]
player_list.append(href)
if(len(key)):
print('此视频经过加密')
print(player_list)#打印ts地址列表
for i,j in enumerate(player_list):
cryptor = AES.new(key, AES.MODE_CBC, key)
res = requests.get(j,headers=headers)
with open('merge/' + str(i+1) + '.ts','wb') as file:
file.write(cryptor.decrypt(res.content))#将解密后的视频写入文件
print('正在写入第{}个文件'.format(i+1))
else:
print('此视频未加密')
print(player_list)#打印ts地址列表
for i,j in enumerate(player_list):
res = requests.get(j,headers=headers)
with open('merge/' + str(i+1) + '.ts','wb') as file:
file.write(res.content)
print('正在写入第{}个文件'.format(i+1))
print('下载完成')
#当全写下载完之后合并文件并删除所有.ts文件
def merge_ts():
path = os.getcwd() + '\merge'#获取视频存放路径
merge_cmd = 'copy /b ' + path + '\*.ts ' + path + '\\new.mp4'
del_cmd = 'del ' + path + '\*.ts'
os.system(merge_cmd)#执行合并命令
os.system(del_cmd)#执行删除命令
print('合并完成')
if __name__ == '__main__':
url = 'https://cdn.letv-cdn.com/2018/12/05/JOCeEEUuoteFrjCg/playlist.m3u8'
#下载视频
m3u8(url)
#合并视频
merge_ts()
#Link:http://blog.csdn.net/lingluofengzang
#
Python
Version:
python
2.7
#filename:download_movie.py
import os
import sys
import reques
ts
reload(sys)
sys.setdefaulte
爬虫可以看做是一个非常规手段,通常,该手段是借助
Python
编程(其中有各种各样的工具,框架,库类)来绕过网站的安全和权限来获得所需的资源。
so,对于爬虫来说,没有道德(比如,某些爬虫上w的并发,那么,一些小站可能就会崩溃,其实爬虫也是可以作为网络攻击的,假设有需要攻击的网站,上w甚至上百万的并发爬虫持续攻击,这个网站可能开不了),没有知识产权(爬虫行为本来就是无视知识产权的,例如,
爬取
视频
,音乐,文章),没有网站安全这些规则(通常,爬虫一旦开始,除非快速的自动封禁,例如,封IP,否则无法停止)
python
爬虫相关:
由于很多网站上的
视频
只提供在线观看,没有下载入口,故有必要进行网络爬虫获取
视频
资源。
利用reques
ts
获取网页源代码中的
m3u8
链接,对链接进行逐步解析,获取
ts
列表,下载所有
ts
文件
,将其
合并
生成
mp4
文件
。做到对
视频
的
爬取
。
同名博文相关代码。
有时候看电影想珍藏下来,但是有
ts
文件
下载下来播放不了,那么恭喜你遇到
视频
加密了很多网站直接返回一个个
ts
文件
,通过ajax请求挨个返回。有些
ts
文件
是有规律可循的,有些是没有规律可循的,不过一般没有规律的
ts
文件
名,都是在一个叫
m3u8
这个
文件
里面的。比如这样:#EXTM3U#EXT-X-VERSION:3#EXT-X-TARGETDURATION:13#EXT-X-MEDIA-SEQUENCE...
需求:有时看到网上的
视频
并不是引用
mp4
链接播放的,而是src=’'blob:xxx"这种引用,无法直接用爬虫直接
爬取
<video ... src="blob:https://www.finger66.com/4b1aa32e-602c-4211-a557-87f7adccdb5e"></video>
分析真实的资源:F12打开调试工具,点击播放并查看NetWork下...
TS
(Transpor
tS
tream,传输流)是一种封装的
格式
,它的全称为MPEG2-
TS
。MPEG2-
TS
是一种标准数据容器
格式
,传输与存储音
视频
、节目与系统信息协议数据,主要应用于数字广播系统,譬如DVB、A
TS
C与IPTV。传输流最初是为广播而设计的。后来,通过在标准的188字节数据包中添加4字节的时间码(TC),从而使该数据包成为192字节的数据包,使其适用于数码摄像机,录像机和播放器。
1.高级加密标准
AES
(Advanced Encryption Standard),支持三种密码标准:
128
位、192位和256位。这里采用的是
128
位ECB加密模式,密钥为16字节十六进制数组。
2.在加密之前先安装好对应的加密库:
python
在Windows下安装pycryptodome 模块 pip install pycryptodome ;
python
在Linux下...
前几天想把某
视频
网站上的
视频
下载到本地,然后发现该
视频
网站上的
视频
被切成了数千个
ts
文件
,并且
ts
的
文件
列表中,记录着有key、IV,也就是
视频
会被网页上的播放器获取,然后在本地完成
解密
,才显示给用户看,然后自己就写了个小工具,把该网站上所有
视频
分段都下载到本地,然后完成
解密
,然后用FFmpeg将
ts
格式
合成
mp4
格式
文件
。
后来某次又遇到另外一个网站,发现
视频
播放的原理也是一样的,网页播放器从...