如何解析 m3u8 文件?

如何解析 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>]
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章