第二章:基于DrissionPage的M3U8文件解密与视频合并技术详解
背景
解决m3u8文件中加密视频的问题,我们首先需要了解加密的原理,然后根据原理来解密视频。
1、加密原理
m3u8文件中的视频内容可以被加密,以保护版权和防止未授权访问。在HTTP Live Streaming (HLS)流中,有两种主要的加密方法:
-
AES-128加密:这是HLS中最常见的加密方法。在这种模式下,每个
.ts
文件或.m3u8
播放列表文件都可以被单独加密。加密的.ts
文件通常有一个.ivf
(初始化向量文件)扩展名,但技术上它仍然是一个.ts
文件。在M3U8文件中,#EXT-X-KEY
标签用于指定密钥信息,包括加密方法、获取密钥的URL和初始化向量(IV)。 -
样本加密(Sample Encryption):样本加密是对视频和音频样本进行加密,而不是对整个文件进行加密。这种方法可以减少延迟,因为它允许播放器在下载密钥后立即开始解密和播放媒体流。
-
DRM加密(Digital Rights Management):除了AES-128加密外,HLS还支持DRM加密,如PlayReady和Widevine。这些DRM解决方案提供了更高级的保护,但也需要客户端支持相应的DRM客户端。
2、解密方法
- 获取密钥:首先,需要从M3U8文件中指定的URL下载密钥。这通常通过
#EXT-X-KEY
标签中的URI
字段指定。在m3u8文件中,加密信息是通过#EXT-X-KEY
标签来存储的,这个标签包含了密钥的URL和初始化向量(IV)。以下是具体的存储方式:
(1)密钥的URL(URI):这是密钥存储的位置,客户端需要从这个URL下载密钥以用于解密视频流。在#EXT-X-KEY
标签中,密钥的URL通过URI
参数指定。例如:
#EXT-X-KEY:METHOD=AES-128,URI="https://example.com/keyfile"
这里METHOD
指定了加密方法,这里是AES-128,而URI
指定了密钥文件的URL。
import re
# 读取爬到的m3u8文件中通过正则匹配到对应的URL
def parse_m3u8_text(m3u8_text):
m3u8_text = m3u8_text.split()
encode_info = [line for line in m3u8_text if line.startswith('#EXT-X-KEY:')][0]
pattern = r"#EXT-X-KEY:METHOD=(.*),URI=\"(.*)\""
match = re.search(pattern, encode_info)
if match:
method = match.group(1)
key_url = match.group(2)
else:
raise '解析失败'
return method, key_url
if __name__ == "__main__":
method, key_ur