使用python下載網絡上加密的ts格式視頻,並用ffmpeg進行合成

前幾天想把某視頻網站上的視頻下載到本地,然後發現該視頻網站上的視頻被切成了數千個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

發佈了17 篇原創文章 · 獲贊 20 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章