前幾天想把某視頻網站上的視頻下載到本地,然後發現該視頻網站上的視頻被切成了數千個ts文件,並且ts的文件列表中,記錄着有key、IV,也就是視頻會被網頁上的播放器獲取,然後在本地完成解密,才顯示給用戶看,然後自己就寫了個小工具,把該網站上所有視頻分段都下載到本地,然後完成解密,然後用FFmpeg將ts格式合成mp4格式文件。
後來某次又遇到另外一個網站,發現視頻播放的原理也是一樣的,網頁播放器從服務器獲取ts文件清單,然後清單中包含了解密用key和IV,於是就打算把解密方式寫成一個方法以供大家以後方便使用。
此處需要安裝python的pycrypto庫,這個庫安裝起來似乎不容易,但是因爲是以前就裝了,細節不再贅述。
此處還是用python調用FFmpeg直接在代碼中實現視頻合併功能,我試了一下,此方法在windows、Mac下都生效,只要注意好本地保存目錄不能用中文字符,一般都沒有問題。
FFmpeg下載地址:http://ffmpeg.org/download.html
以下是下載並解密ts文件的代碼
from Crypto.Cipher import AES
import re
import requests
def getVideoFile(directdir:str,url:str,key:str,IV:str)->str:
"""用於下載視頻並完成解密
:param directdir: 保存文件的目錄
:param url:下載的地址
:param key:ts文件的key
:param IV:ts文件加密的IV向量
:return:
"""
print('準備從',url,'下載文件到',directdir)
# 下載注意開啓流
r=requests.get(url,stream=True)
# 從請求頭文件中獲取文件名
fileNameOriginal=r.headers['Content-Disposition']
searchObj=re.search(r'filename=".+"',fileNameOriginal)
fileName=''
if searchObj:
fileNameMatch=searchObj.group().split('"')
fileName=fileNameMatch[1]
newdir=directdir+"/"+fileName
#開始構建解密方法
mode = AES.MODE_CBC
cryptor=AES.new(key.encode('utf-8'),mode,IV)
with open(newdir,'wb') as f:
f.write(cryptor.decrypt(r.content))
print(newdir,'文件下載成功')
return newdir
將下載好的ts文件的列表保存在一個txt格式文件裏。
import os
def creatFile(fileContent:str,path:str,filename=''):
"""保存下載好的文件的儲存地址,便於後文中用FFmpeg進行文件合併
:param fileContent: 需要保存的內容
:param path: 保存的地址
:param filename:保存的文件名
:return:
"""
if filename!='':
path=path+os.sep+filename
file = open(path, 'w')
for line in fileContent:
file.write(line)
file.write('\n')
file.close()
假如你的電腦已經安裝了FFmpeg了,並且也下載好了ts格式文件了,並且將所有需要合併成一個mp4格式的ts文件地址存在一個txt文件裏了(後文用videoOrder.txt)。那麼久可以執行以下代碼
import os
def mergeFile(file_path,outputfile):
"""用於合併ts文件爲一個mp4文件,前提是電腦裏安裝FFmpeg
:param file_path: 保存ts文件地址列表的txt所在文件夾,轉好格式的文件也會保存在這個目錄下
:param outputfile: mp4格式文件名
:return:
"""
print("開始合併文件")
str = r'ffmpeg -y -f concat -safe 0 -i '+ file_path +'\\videoOrder.txt -c copy '+ file_path +'\\'+ outputfile + '.mp4'
print(str)
os.system(str)
print("文件合併完成")
最後,下載完視頻並完成合並後,本地會留有很多ts格式文件,留着沒用純粹浪費空間,在對應目錄下創建一個bat格式文件,保存一下內容,然後執行一下就好了。(批量刪除文件有風險哈)
del /a /f /s /q "*.ts"
拓展閱讀:https://blog.csdn.net/weixin_34190136/article/details/85989221