添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

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 格式 文件 。 后来某次又遇到另外一个网站,发现 视频 播放的原理也是一样的,网页播放器从...