關於m3u8格式的視頻文件ts轉mp4下載和key加密問題

一,利用網站瀏覽器F12鍵,利用谷歌瀏覽器插件找到視頻的.m3u8文件,並打開。

 

二,打開m3u8文件後,裏面有不少.ts的連接,和key的連接。

 

三,保存爲html文件,下載ts文件,代碼以下:可加多線程,可能須要用代理。

 1 # 爬蟲 123.html就是打開m3u8文件右鍵保存爲html格式。
 2 htmlf=open('./123.html','r',encoding="utf-8")
 3 htmlcont=htmlf.read()
 4 # print(htmlcont)
 5 import requests
 6 from lxml import etree
 7 tree = etree.HTML(htmlcont)
 8 href = tree.xpath("//a//@href")
 9 # print(href)
10 ts = href[2273:]
11 print(len(ts))
12 # print(ts)
13 for i in ts:
14     a = i.split("/")[-1]
15     # print(a)
16     headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.87 Safari/537.36"}
17     try:
18         rest = requests.get(i,headers=headers)
19         if rest.status_code == 200:
20             with open(a,"wb") as fp:
21                 fp.write(rest.content)
22                 fp.close()
23     except Exception as e:
24          print(e)

四,方法參考1:

參考連接:https://gist.github.com/larvata/95df619df7109d8b74d2b965a3266354#ffmpeg-cheatsheethtml

首先 先下載 key 和 m3u8 
而後修改 m3u8 中 key 的路徑
最後 用 ffmpeg 下載
ffmpeg -i <source.m3u8> -c copy <target.ts>python

四,方法參考2:

關於m3u8文件, ts文件解密, hls 解密. 一些記錄git

 使用openssl 解密

openssl aes-128-cbc -d -in 原.ts -out 解密後.ts -nosalt -iv 偏移量 -K key16進制
其中 iv 偏移量和 key 通常都會在 m3u8 中。 key要按地址下載下來, iv偏移量是可選的,若是m3u8裏沒有iv,iv能夠隨便設置爲0。
還能夠直接使用 ffmpeg 直接合並文件。github

 五,對於加密的m3u8文件:

m3u8視頻另外一種下載方式
如上圖中用ts連接直接下載下來的ts視頻文件是加密的(爲何要下加密的?雖然加密可是下載速度快啊)。瀏覽器

#EXT-X-KEY 字段已經寫明瞭加密方式是AES-128,key經過URI獲取,IV也有。markdown

那怎麼解密呢?
1.複製URI地址到網頁,你將秒速自動下載獲得一個16字節文件
2.打開終端,打開該文件查看16進制:多線程

六,獲取key值:

 下載m3u8裏的key文件,下載winhex.exe應用程序,安裝以後,把key文件拖入winhex裏,自動生成16進制。函數

 

 七,合成下載好的.ts文件:post

左下角點擊運行:cmd網站

copy /b  文件所在盤:\子文件\*.ts  儲存的文件夾:\子文件\new.ts

把上邊的漢字換成盤符和文件所在的文件夾。

注意:合併ts文件時,若是ts文件超過1000,排序就會有問題,會出現,121,1210,1211.。。。。。122,1220,1221,1222.。。。。。

這裏分爲幾個部分,按批次合併。

 

八,合成一個ts文件以後還不能打開,由於ts是加密的。

 

 這裏,沒有iv值,用0代替。這樣解密以後的ts文件便可播放。

九,注:ts文件的順序必須是有序的,不可缺乏的。

參考網址:簡書:https://www.jianshu.com/p/1b0adcc7b426

 全部的ts轉MP4,新建文本文檔,ren *.mp4 *.ts,修改後綴.bat,運行便可。

 key值文件下載以下圖:(需轉16進制數)

 十,關於報錯

hex string is too short, padding with zero bytes to length
bad decrypt
25916:error:0606506D:digital envelope routines:EVP_DecryptFinal_ex:wrong final block length:crypto\evp\evp_enc.c:559:

解決方法:

# 遍歷文件夾進行解密(執行cmd命令,必定查看當前路徑問題)
import os
for root, dirs, files in os.walk("E://BaiduNetdiskDownload//123//1",topdown=False):
	print(len(files))
	os.system("cd 1")
	os.system("cd")
	for f in files:
		print(f)
		# os.system("openssl aes-128-cbc -d -in 7udG3475000.ts -out ./11/7udG3475000.ts -iv 00000000000000000000000000000000 -K 65323739393530323866636362626661"%(f,f))
		os.system("openssl aes-128-cbc -d -in ./1/%s -out ./1/11/%s -iv 00000000000000000000000000000000 -K 65323739393530323866636362626661"%(f,f))

  先解密,再合併爲一個文件。先把一個個小的ts文件解密,以後再進行合併爲大的ts,最後再改格式爲MP4,這種比較好,視頻播放不會出現卡頓,若是是先合併再解密,斷點播放會出現卡頓現象。

文件夾如圖:1234文件夾裏每一個ts都通過解密,而後合併爲111222333444四個文件。在進行合併改格式便可。

 

報錯問題函待解決:

用 openssl 進行解密,知道是 AES-128-CBC 解密,有 key 文件( 16 字節),用 hexdump 查看密鑰發現是 32 字節的,用命令 openssl aes-128-cbc -d -in in_file.ts -out out_file.ts -nosalt -iv 00000000000000000000000000000001 -K XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 進行解密,解密到最後提示 error:0606506D:digital envelope routines:EVP_DecryptFinal_ex:wrong final block length:evp_enc.c:528: 查閱過資料出現 EVP_DecryptFinal_ex 函數錯誤這提示有多是還有沒解密完的數據塊,通常狀況是密文不正確、不是塊大小的整數倍纔會出現沒解密完的數據塊,可是我嘗試下載解密其餘碼率的 m3u8 文件(如 500K,1000K,2000K )用的都是同個密鑰,都能成功解密,惟獨這個 3000K 的解密出現問題,以後覺得是文件下載不徹底,後來又下載下載了一直想不通哪裏出問題,是由於視頻容量太大致使嗎?仍是我解密的方法有問題。

相關文章
相關標籤/搜索