解码M3U8在线流视频AES-128解密TS合并到MP4

本文针对网站视频进行解密合并,对m3u8加密的ts视频流具有通用性(对于m3u8的介绍,请见最下方参考资料)。

  • 使用工具:ffmpeg(下载和安装方法可自行百度)
  • 在视频网页上按F12,进入“网络”标签,播放一会儿视频后,在筛选框中输入“m3u8”,查看响应结果,发现此站m3u8是AES-128加密,有秘钥key,下载该m3u8文件到本地(如果无法下载则直接复制响应结果到txt文件中,保存该txt文件,保存的文件名和后缀名要与视频网站中的相一致)
  • 以同样的方法下载key文件(m3u8文件里有key文件的url,也可据此直接下载key文件)
  • 以同样的方法,在筛选框中输入“ts”,发现有多个ts文件,这些ts文件的get请求地址,除了具体的文件名不同之外,其他都相同。这些ts文件名也都出现在了m3u8文件中。可以通过程序代码或其他工具,统一将m3u8文件中出现的ts文件下载到本地。
  • 将m3u8文件、key文件、ts文件放到同一个文件夹中,修改m3u8文件,将其中的

    URI字段的值改为key文件的文件名(如key文件为ts.key,则改为URI="ts.key")。

  • 打开命令提示符(cmd)界面,通过cd命令进入存放m3u8文件、key文件、ts文件的文件夹,设m3u8文件为index.m3u8,要合并成的mp4文件名为output.mp4,则在cmd中输入如下命令

    ffmpeg -allowed_extensions ALL -i "index.m3u8" -c copy output.mp4

另,如果ts文件并没有加密(即能直接通过视频播放器打开播放),则下载了ts文件后,可直接在cmd界面输入如下命令合并成mp4

ffmpeg -f concat -safe 0 -i <video_list_path> -c copy <output_path>

其中:

  • <video_list_path>是写有待合并ts文件地址列表的文本文件地址(如 D:\file\video_list.txt),文件中的每一行都是一个ts文件地址,其格式如
file 'D:\file\video0.ts'
file 'D:\file\video1.ts'
file 'D:\file\video2.ts'
  • <output_path>为要合并成的mp4文件地址(如 D:\file\output.mp4)

附:通过python3统一下载ts文件,支持断点续传(其中的params、headers、proxies、path_output_dir、path_output_file_dir、start_index、end_index、url请按实际情况填写)

import requests
import os
import glob
from tqdm import tqdm

def download(url, path_output):
    params = {}
    headers = {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:100.0) Gecko/20100101 Firefox/100.0",
        "Accept": "*/*",
        "Accept-Language": "zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2",
        "Accept-Encoding": "gzip, deflate, br",
        "Connection": "keep-alive",
        "Pragma": "no-cache",
        "Cache-Control": "no-cache"
    }
    proxies = {"http": "127.0.0.1:1080", "https": "127.0.0.1:1080"}
    # 自动对params进行编码,然后自动和url进行拼接,去发请求
    rsp = requests.get(url, params=params, headers=headers, proxies=proxies)
    with open(path_output, 'wb') as f:
        f.write(rsp.content)
        f.close()
    
path_output_dir = "./data"
path_output_dir = os.path.abspath(path_output_dir)
path_output_file_dir = os.path.join(path_output_dir, 'file')
if not os.path.exists(path_output_file_dir):
    os.makedirs(path_output_file_dir)
path_file_list=glob.glob(os.path.join(path_output_file_dir, '*.ts'))
start_index = len(path_file_list)

end_index = 100
for i in tqdm(range(start_index, end_index + 1)):
    url = f"https://www.example.com/index{i}.ts"
    path_output = os.path.join(path_output_file_dir, f"index{i}.ts")
    download(url, path_output)

参考资料:Programer_Log/2020/3-26-m3u8-decrypt at master · makelove/Programer_Log · GitHub

猜你喜欢

转载自blog.csdn.net/dsx4602/article/details/124629457