如何解析 m3u8 文件?
- 2019 年 10 月 10 日
- 筆記
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_40313634/article/details/100898792
如何解析 m3u8 文件
1. AES
- 思路:
说个使用python解带key的M3U8的思路: 先下载KEY文件,使用这个key解密每一个ts文件,然后合并MP4。 m3u8 url:http://video1.aa/090812-124/1500kb/hls/index.m3u8
- 例子
from Crypto.Cipher import AES import requests uu='http://video1.aa/090712-123/1500kb/hls/' res = requests.get(uu+'key.key') key=res.content cryptor = AES.new(key, AES.MODE_CBC, key) for i in range(30): u='%sKhbR41840%02d.ts'%(uu,i) print(u) res = requests.get(u) with open("/home/jet/jupy/TS/xx.mp4", 'ab') as f: #f.write(res.content) f.write(cryptor.decrypt(res.content))
m3u8 文件格式
: 文件开头的标记 #EXTM3U : 最大的媒体播放时长(每个EXTINF值必须小于这个), 单位是秒 #EXT-X-TARGETDURATION:<s> : 指定每个媒体段(ts)的持续时间 #EXTINF : 每一个媒体段在 PlayList 中只有唯一的序号,相邻之间序号+1。 #EXT-X-MEDIA-SEQUENCE:<number> : 表示怎么对媒体段进行解码。其作用范围是下次该tag出现前的所有媒体段 #EXT-X-KEY:<attribute-list> : 是否允许客户端用缓存来重播,这个可以在PlayList文件中任意地方出现,并且最多出现一次,作用效果是所有的媒体段 #EXT-X-ALLOW-CACHE :<YES|NO> : 将一个绝对时间和一个媒体段中的第一个sample相关联 :: example: #EXT-X-PROGRAM-DATETIME:2010-02-19T14:54:23.031+08:00 #EXT-X-PROGRAM-DATE-TIME : 文件结束标记 #EXT-X-ENDLIST
加密
- 表示怎么对媒体段进行解码。其作用范围是下次该tag出现前的所有媒体段 如果播放列表文件没有包含EXT-X-KEY标签,那么媒体文件将不会被加密。
- Method属性指定了加密方法,定义了两种加密方法:NONE和AES-128。 加密方法NONE表示媒体文件不被加密,如果加密方法是NONE,那么URI和IV属性不允许存在。
- 如果加密方法是AES-128,那么对于URI属性,如果存在,则指定获取密钥的方法。 对于IV属性,如果存在,则指定使用密钥的初始化向量; 如果不存在,在加密或者解密媒体文件的时候必须使用序列号作为IV值。
#EXT-X-KEY:METHOD=<method> [,URI = “<uri>”] [,IV = <iv>]