關於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-cheatsheet

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

四,方法參考2:

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

 使用openssl 解密

openssl aes-128-cbc -d -in 原.ts -out 解密后.ts -nosalt -iv 偏移量 -K key16進制
其中 iv 偏移量和 key 一般都會在 m3u8 中。 key要按地址下載下來, iv偏移量是可選的,如果m3u8里沒有iv,iv可以隨便設置為0。
還可以直接使用 ffmpeg 直接合並文件。

 五,對於加密的m3u8文件:

m3u8視頻另一種下載方式
如上圖中用ts鏈接直接下載下來的ts視頻文件是加密的(為什么要下加密的?雖然加密但是下載速度快啊)。

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

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

六,獲取key值:

 下載m3u8里的key文件,下載winhex.exe應用程序,安裝之后,把key文件拖入winhex里,自動生成16進制。

 

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

左下角點擊運行: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 的解密出現問題,之后以為是文件下載不完全,后來又下載下載了一直想不通哪里出問題,是因為視頻容量太大導致嗎?還是我解密的方法有問題。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM