一、按F12,先找出m3u8的url,预览内容是如以下这种类型,然后复制出请求URL

#EXTM3U
#EXT-X-VERSION:3
#EXT-X-TARGETDURATION:16
#EXT-X-MEDIA-SEQUENCE:0
#EXT-X-KEY:METHOD=AES-128,URI="https://ke.qq.com/cgi-bin/qcloud/get_dk?edk=CiBENw8S52C77Pg9t2ak1u%2FD9NfhZ3F7%2BoiW%2BM5iBKyMbBCO08TAChiaoOvUBCokOTMyNDg4YmItOWZjYS00MzFiLWJiYjItNjFmMDhjYjNlYmM3&fileId=5285890815554519079&keySource=VodBuildInKMS&token=dWluPTM1MTc4MzU1NDQ7c2tleT1AQklIMFlFYU9SO3Bza2V5PUpPUE44RVUtLXdMUWxqeERZVHUyNEFoa3kqVGh5NGp5clBpbUIzbUJscW9fO3Bsc2tleT0wMDA0MDAwMDc2MTNiOTRmMjA4NmU1NTJjNzhkYzI3NzdhYjQ3NGQxYzZhNGEzN2ZkNTVmMDc4ODZhODFjNDI3MTBmZTA2MTJmN2EwZjFkNzczOTU1OTMyO2V4dD07dWlkX3R5cGU9MDt1aWRfb3JpZ2luX3VpZF90eXBlPTA7Y2lkPTMzODU0OTE7dGVybV9pZD0xMDM1MTg0OTg7dm9kX3R5cGU9MA%3D%3D",IV=0x00000000000000000000000000000000
#EXTINF:2.000000,
v.f30742.ts?start=0&end=506863&type=mpegts&exper=0&sign=4142361e5f70dc1887bb4374a6c8499a&t=60eab641&us=6759179987002315823
#EXT-X-KEY:METHOD=AES-128,URI="https://ke.qq.com/cgi-bin/qcloud/get_dk?edk=CiBENw8S52C77Pg9t2ak1u%2FD9NfhZ3F7%2BoiW%2BM5iBKyMbBCO08TAChiaoOvUBCokOTMyNDg4YmItOWZjYS00MzFiLWJiYjItNjFmMDhjYjNlYmM3&fileId=5285890815554519079&keySource=VodBuildInKMS&token=dWluPTM1MTc4MzU1NDQ7c2tleT1AQklIMFlFYU9SO3Bza2V5PUpPUE44RVUtLXdMUWxqeERZVHUyNEFoa3kqVGh5NGp5clBpbUIzbUJscW9fO3Bsc2tleT0wMDA0MDAwMDc2MTNiOTRmMjA4NmU1NTJjNzhkYzI3NzdhYjQ3NGQxYzZhNGEzN2ZkNTVmMDc4ODZhODFjNDI3MTBmZTA2MTJmN2EwZjFkNzczOTU1OTMyO2V4dD07dWlkX3R5cGU9MDt1aWRfb3JpZ2luX3VpZF90eXBlPTA7Y2lkPTMzODU0OTE7dGVybV9pZD0xMDM1MTg0OTg7dm9kX3R5cGU9MA%3D%3D",IV=0x00000000000000000000000000000000
#EXTINF:2.000000,
v.f30742.ts?start=506864&end=1098319&type=mpegts&exper=0&sign=4142361e5f70dc1887bb4374a6c8499a&t=60eab641&us=6759179987002315823
#EXT-X-KEY:METHOD=AES-128,URI="https://ke.qq.com/cgi-bin/qcloud/get_dk?edk=CiBENw8S52C77Pg9t2ak1u%2FD9NfhZ3F7%2BoiW%2BM5iBKyMbBCO08TAChiaoOvUBCokOTMyNDg4YmItOWZjYS00MzFiLWJiYjItNjFmMDhjYjNlYmM3&fileId=5285890815554519079&keySource=VodBuildInKMS&token=dWluPTM1MTc4MzU1NDQ7c2tleT1AQklIMFlFYU9SO3Bza2V5PUpPUE44RVUtLXdMUWxqeERZVHUyNEFoa3kqVGh5NGp5clBpbUIzbUJscW9fO3Bsc2tleT0wMDA0MDAwMDc2MTNiOTRmMjA4NmU1NTJjNzhkYzI3NzdhYjQ3NGQxYzZhNGEzN2ZkNTVmMDc4ODZhODFjNDI3MTBmZTA2MTJmN2EwZjFkNzczOTU1OTMyO2V4dD07dWlkX3R5cGU9MDt1aWRfb3JpZ2luX3VpZF90eXBlPTA7Y2lkPTMzODU0OTE7dGVybV9pZD0xMDM1MTg0OTg7dm9kX3R5cGU9MA%3D%3D",IV=0x00000000000000000000000000000000
#EXTINF:2.000000,
v.f30742.ts?start=1098320&end=1664207&type=mpegts&exper=0&sign=4142361e5f70dc1887bb4374a6c8499a&t=60eab641&us=6759179987002315823
#EXT-X-KEY:METHOD=AES-128,URI="https://ke.qq.com/cgi-bin/qcloud/get_dk?edk=CiBENw8S52C77Pg9t2ak1u%2FD9NfhZ3F7%2BoiW%2BM5iBKyMbBCO08TAChiaoOvUBCokOTMyNDg4YmItOWZjYS00MzFiLWJiYjItNjFmMDhjYjNlYmM3&fileId=5285890815554519079&keySource=VodBuildInKMS&token=dWluPTM1MTc4MzU1NDQ7c2tleT1AQklIMFlFYU9SO3Bza2V5PUpPUE44RVUtLXdMUWxqeERZVHUyNEFoa3kqVGh5NGp5clBpbUIzbUJscW9fO3Bsc2tleT0wMDA0MDAwMDc2MTNiOTRmMjA4NmU1NTJjNzhkYzI3NzdhYjQ3NGQxYzZhNGEzN2ZkNTVmMDc4ODZhODFjNDI3MTBmZTA2MTJmN2EwZjFkNzczOTU1OTMyO2V4dD07dWlkX3R5cGU9MDt1aWRfb3JpZ2luX3VpZF90eXBlPTA7Y2lkPTMzODU0OTE7dGVybV9pZD0xMDM1MTg0OTg7dm9kX3R5cGU9MA%3D%3D",IV=0x00000000000000000000000000000000
#EXTINF:2.000000,
.....


二、拿ts文件请求链接的前缀

(因为第一次拿到的链接,获取到的ts链接是没有前缀的)
随便找一个**v.f30742.ts?**开头的链接,复制它的请求url,只取v.f30742.ts?前面部分
取出链接:https://1258712167.vod2.myqcloud.com/5a81e359vodtranssh1258712167/fe20c2755285890815554519079/drm/
原本链接:https://1258712167.vod2.myqcloud.com/5a81e359vodtranssh1258712167/fe20c2755285890815554519079/drm/v.f30742.ts?start=2184608&end=2711583&type=mpegts&exper=0&sign=4142361e5f70dc1887bb4374a6c8499a&t=60eab641&us=6759179987002315823

三、对ts文件进行解密下载并合并,代码如下

import re
import requests
import os,uuid
from Crypto.Cipher import AESclass Demo(object):'''调用方法:1、先实例化一个Demo对象2、把提取的m3u8url放在url, 把提取的ts  url前缀放在base_url2、调用demo的download_ts方法,并将两个参数(url,base_url)传进去只需要在download方法中传入一个m3u8url即可'''# 返回当前文件路径def get_filpath(self):# 先判断ts_files文件夹是否存在,不存在则创建if not os.path.exists('ts_files'):os.system('mkdir ts_files')f_path=os.getcwd()+'\\ts_files\\'return f_path# 将ts文件合并转换成mp4def ts_to_mp4(self):path = self.get_filpath()mp4_name = str(uuid.uuid1()) + '.mp4'print(mp4_name)merge_cmd = 'copy /b ' + path + '\*.ts ' + path + '\\' + mp4_name#  转换成功后,删除ts文件# del_cmd = 'del ' + path + '\*.ts' os.system(merge_cmd)# os.system(del_cmd)print('转换完成')def download_ts(self,url,base_url):# 获取初始的ts_urls 和contentres = requests.get(url=url)pay_list = res.text.split('\n')ts_urls = pay_list[9:-1:3]# 获取加密的方法和密钥content=res.textmethod = re.findall('#EXT-X-KEY:METHOD=(.*?),', content)[0]# 获取加密urlkey = re.findall('#EXT-X-KEY:METHOD=AES-128,(.*?)\n', content)[0]key_url = re.findall('"(.*?)"', key)[0]# 对加密url发起请求res = requests.get(key_url)# 获取返回来的加密密钥key = res.content# 获取偏移向量 iviv=re.findall('IV=(.*?)\n',content)[0]iv=iv.replace('0x','')iv=bytes.fromhex(iv)cryptor = AES.new(key, AES.MODE_CBC, iv)for i, p in enumerate(ts_urls):ts_url = base_url + pres = requests.get(ts_url)'''注意:ts文件名,要按001这种形式命令,不然,等下在window下合并顺序会出现错乱,导致视频无法播放ts文件比较多的,可以添加位数 如,0001,00001等rjust(3,'0'),3表示位数'''file_name = str(i).rjust(3,'0') + '.ts'file=self.get_filpath()+file_namewith open(file, 'wb') as f:# 对ts文件内容进行解密f.write(cryptor.decrypt(res.content))print('下载完成')self.ts_to_mp4()if __name__=='__main__':# url为第一步提取的urlurl = 'https://1258712167.vod2.myqcloud.com/5a81e359vodtranssh1258712167/fe20c2755285890815554519079/drm/voddrm.token.dWluPTM1MTc4MzU1NDQ7c2tleT1AQklIMFlFYU9SO3Bza2V5PUpPUE44RVUtLXdMUWxqeERZVHUyNEFoa3kqVGh5NGp5clBpbUIzbUJscW9fO3Bsc2tleT0wMDA0MDAwMDc2MTNiOTRmMjA4NmU1NTJjNzhkYzI3NzdhYjQ3NGQxYzZhNGEzN2ZkNTVmMDc4ODZhODFjNDI3MTBmZTA2MTJmN2EwZjFkNzczOTU1OTMyO2V4dD07dWlkX3R5cGU9MDt1aWRfb3JpZ2luX3VpZF90eXBlPTA7Y2lkPTMzODU0OTE7dGVybV9pZD0xMDM1MTg0OTg7dm9kX3R5cGU9MA==.v.f30742.m3u8?exper=0&sign=4142361e5f70dc1887bb4374a6c8499a&t=60eab641&us=6759179987002315823'#base_url 为第二步提取的url前缀base_url='https://1258712167.vod2.myqcloud.com/5a81e359vodtranssh1258712167/fe20c2755285890815554519079/drm/'h = Demo()h.download_ts(url=url,base_url=base_url)

注意:最后合成有可能出现,找不到文件的错误提示,原因:你路径有问题,可以自己在cmd进行合并
合并命令如下:

# path是路径
'copy /b '+path+'\*.ts '+ path+'\\new1.mp4'

(2) 如果遇到iv提示报错 ValueError: Incorrect IV length (it must be 16 bytes long)
则需要对iv进行处理

# 如IV=0x0E16B71765DC9B699C33DC5901307461
# 1、先将iv值首两位给剔除掉,因为首两位是0x是16进制标识,去掉后就剩下32位字符串了
iv=IV[2:]
# 2、将32位字符串转成16进制
iv=bytes.fromhex(iv)

最后效果如下:

下一次,再把多线程加进入,还有linux下的合并方法。
注意:最好用linux合并,window合并上传到服务器可能会播放不了
linux下合并脚本如下:

import os
#ts文件绝对路径
ts_path = '/home/ts_files'#读取ts文件夹下所有的ts文件
path_list = os.listdir(ts_path)#对文件进行排序
path_list.sort()#将排序后的ts的绝对路径放入列表中
li = [os.path.join(ts_path,filename) for filename in path_list]#类似于[001.ts|00.2ts|003.ts]
input_file = '|'.join(li)#指定输出文件名称
output_file = ts_path + '.mp4'#使用ffmpeg将ts合并为mp4
command = 'ffmpeg -i "concat:%s" -acodec copy -vcodec copy -absf aac_adtstoasc %s'%    (input_file,output_file)#指行命令
os.system(command)

注意

有的key的url需要加一个token才可以获取到密钥,如:技成培训网站

使用进程池和线程池、协程池三种方式,可以提高效率,但是,效率有一个峰值。代码如下:

# -*-coding:utf-8-*-
import re
import timeimport requests
import os, uuid
from Crypto.Cipher import AESfrom gevent import monkey
import gevent
from gevent.pool import Pool
from concurrent.futures import ThreadPoolExecutor,ProcessPoolExecutorimport sys
sys.setrecursionlimit(100000000)
# 获取key 和iv
def get_key_iv(content):# 正则获取加密方法,正常都是AES-128method = re.findall('#EXT-X-KEY:METHOD=(.*?),', content)[0]# 正则获取密钥在服务器的urlkey_url = re.findall('#EXT-X-KEY:METHOD=AES-128,URI="(.*?)"', content)[0]# 对key_url发起请求获取密钥,如果请求失败,则在调试面板看是否缺少token等参数key = requests.get(key_url).content# 获取iv(偏移量)iv = re.findall('IV=(.*?)\n', content)[0]# 将iv的首两位标识(16进制标识)去除,可以采用切片或者替换iv = iv.replace('0x', '')# 将iv字符串转成16进制iv = bytes.fromhex(iv)dic = {'key': key,'iv': iv}return dic# 获取ts列表url
def get_ts_list(content):data_list = content.split('\n')is_first = 0first_num = 0for i, data in enumerate(data_list):if '.ts' in data and is_first == 0:first_num = iis_first = 1elif '.ts' in data and is_first == 1:is_first = i - first_numbreakts_list = data_list[first_num::is_first]return ts_list# 设置保存路径
def set_file():file_path = os.getcwd() + '\\tsfiles\\'if not os.path.exists(file_path):os.makedirs(file_path)return file_path# 合并ts视频
def ts_to_mp4():path = set_file()mp4_name = str(uuid.uuid1()) + '.mp4'merge_cmd = 'copy /b ' + path + '\*.ts ' + path + '\\' + mp4_name# 根据需求,看合并后,是否保留ts视频del_cmd = 'del ' + path + '\*.ts'os.system(merge_cmd)# os.system(del_cmd)def download_ts(dic):# 统一默认都是有加密的,没有加密只需把true改为falseis_cry = Truei = dic['i']ts = dic['ts']content = dic['content']if is_cry:# 获取加密密钥和偏移值key = get_key_iv(content).get('key')iv = get_key_iv(content).get('iv')# 实例化CBC模式的AES对象cryptor = AES.new(key, AES.MODE_CBC, iv)res = requests.get(ts)# 可以根据ts文件数量,适当设置3(3表示是位数,如 001)file_name = str(i).rjust(3, '0') + '.ts'file = set_file() + file_namewith open(file, 'wb') as f:if is_cry:content = cryptor.decrypt(res.content)else:content = res.contentf.write(content)print('ts{}下载成功'.format(i))if __name__ == '__main__':url = 'https://1258712167.vod2.myqcloud.com/25121a6avodtransbj1258712167/3522b9c75285890816911210574/drm/voddrm.token.dWluPTM1MTc4MzU1NDQ7c2tleT1AUUdUU0JlNzlBO3Bza2V5PVVkUXIwQWVZbVZjUWV4RVFzQk9TWUk5cypPSXZDKk51dXF2S25VSU9NdGdfO3Bsc2tleT0wMDA0MDAwMDNhYzI1YjE5ODFhNzVlZWFkMjNkOGNmMGQ5ODA5Mjk3ZTJlY2E4MzRhMTU5ZDgzM2FjYjU3MzYwYWZjNTk0YTQwZmNjZjBhYzJmNWU3ZWYwO2V4dD07dWlkX3R5cGU9MDt1aWRfb3JpZ2luX3VpZF90eXBlPTA7Y2lkPTM5OTAxNzt0ZXJtX2lkPTEwMDQ3NTk2NTt2b2RfdHlwZT0w.v.f30741.m3u8?exper=0&sign=81967dbbdb625de8455b566adf35c6d2&t=61206ef8&us=269233269408429750'base_url = 'https://1258712167.vod2.myqcloud.com/25121a6avodtransbj1258712167/3522b9c75285890816911210574/drm/'content = requests.get(url).textts_list = get_ts_list(content)pool = Pool(10)  #协程的# 进程池线程池# pool= ThreadPoolExecutor(50)# pool = ProcessPoolExecutor(20)s = time.time()g_list=[]print(len(ts_list))for i, ts in enumerate(ts_list):ts =base_url+ts# download_ts({'ts': ts, 'i': i, 'content': content})# 协程g=pool.spawn(download_ts,({'ts':ts,'i':i,'content':content}))# 线程、进程# pool.submit(download_ts,({'ts':ts,'i':i,'content':content}))# 协程g_list.append(g)# 进程线程# pool.shutdown(wait=True)# 协程gevent.joinall(g_list)print(time.time()-s)'''
正常情况下是:342.5760555267334
协程池:70多秒
进程池和线程池: 50-70多秒左右
'''

M3U8视频解密下载相关推荐

  1. m3u8视频爬虫下载及合并(二)

    前言 爬虫获取m3u8视频资源的步骤 目前所要作的流程处理先把m3u8里下载链接批量提取.png把这几百个切片链接先批量下载.png再批量改文件后缀为.ts 再按照m3u8文件提取所有不规则链接文件的 ...

  2. python合并ts视频_python爬取视频网站m3u8视频,下载.ts后缀文件,合并成整视频

    最近发现一些网站,可以解析各大视频网站的vip.仔细想了想,这也算是爬虫呀,爬的是视频数据. 首先选取一个视频网站,我选的是 影视大全 ,然后选择上映不久的电影 "一出好戏" . ...

  3. Android,播放m3u8视频和下载m3u8的视频

    因最近项目需要,研究了一个礼拜的m3u8.格式为m3u8的视频,其实是由多个.ts文件组成在一起播放的.下面有些资料是参考了网上的,总体概括下实现思路: 1.根据后台给出的m3u8的地址,实现播放,核 ...

  4. m3u8视频格式下载并转换为mp4(ffmpeg)

    通过在网络上查询资料以及博客后发现了下载m3u8转换为mp4得方法,但是在使用后发现转换后的mp4文件信息不完善.如果您使用过网上流传最广的转换方法会发现当你查看mp4文件详细信息时是没有播放时长等数 ...

  5. 加密的m3u8视频下载支持本地m3u8

    m3u8合并解密下载2.3版本 qq群:366950911 支持QQ.UC浏览器等缓存视频合并解密(此软件免费使用),以及KEY大小是16字节的都可以解密,如下图: 如果您无法获取KEY,或者KEY二 ...

  6. Python 实现 m3u8 视频下载

    Python 实现 m3u8 视频下载 m3u8 是一种基于文本的媒体播放列表文件格式,通常用于指定流媒体播放器播放在线媒体流.它是一个简单的文本文件,其中包含多个由 URI 引用的媒体资源文件的 U ...

  7. 针对m3u8视频加密的一些尝试

    前言: 记得我开始之前发过一篇关于某网课的m3u8视频解密的文章,就是下面这篇. 很多小伙伴就看到这篇文章,来到群里问我.我也看到了很多不同的加密(有些加密真变态啊!).学到了很多. 困难1 比如pl ...

  8. java下载m3u8视频,解密并合并ts(二)

    上一篇 java下载m3u8视频,解密并合并ts(一)--m3u8概述 下一篇java下载m3u8视频,解密并合并ts(三)--代码实现 m3u8链接的获取 样例一:两个m3u8无key 首先在浏览器 ...

  9. java下载m3u8视频,解密并合并ts(三)

    上一篇 java下载m3u8视频,解密并合并ts(二)--获取m3u8链接 编写代码 加载jar包 由于java不支持AES/CBC/PKCS7Padding模式解密,所以我们要借助第一篇下载好的ja ...

  10. Java合并m3u8_m3u8Download java 下载 m3u8 视频,解密并合并 ts java download m3u8 vide @codeKK Android开源站...

    java 下载 m3u8 视频,解密并合并 ts m3u8 链接获取方式以及代码分析请参见: https://blog.csdn.net/qq494257084/article/details/103 ...

最新文章

  1. Jzoj4729 道路修建
  2. 处理Matlab Coder之后, Compiler can't find tmwtypes.h问题
  3. 【转】全排列算法非递归实现和递归实现
  4. LeetCode Hot100 ---- 二分查找专题
  5. 《Windows游戏编程大师技巧》三、Windows高级编程
  6. DVbbs8.2入侵思路与总结
  7. 新唐M031学习笔记(一)定时器基础计数应用
  8. @RequestParam的作用
  9. mongodb 远程访问配置
  10. 001-为什么Java能这么流行
  11. c++冒泡排序_python+C、C++混合编程的应用
  12. Python如何运行单个.py文件而不是unittest
  13. Mac下GitHub安装及使用教程
  14. 三菱PLC QCPU用户手册(功能解说/程序基础篇)
  15. 中标麒麟系统安装360浏览器
  16. office2013 安装易用宝不成功
  17. html 在线测试 鱼缸,研究员试图用AR鱼缸欺骗鱼的感官系统,结果反被鱼识破
  18. 制作背景透明图标的小工具(附源代码)
  19. python列表遍历元组_Python 元组遍历排序操作方法
  20. 什么是大数据?2022大数据时代

热门文章

  1. 游戏设计自学记录(入门完结)
  2. 苹果电脑拷贝文件到u盘很慢_给自己挑个好U盘,再也不想天天找同事借了
  3. opencv4 QR码检测和识别源码解析
  4. 《Ogre一步一步学开发》 一、Ogre源码编译与安装,从源代码开始构建Ogre图文教程(Ogre 1.12.1 Source + VS2019 + Windows10)
  5. 力扣刷题 DAY_62 回溯
  6. nodejs调用wasm系列-保利威视-难度等级二
  7. 路德维希贝多芬计算机怎么操作,路德维希·凡·贝多芬(Ludwig van Beethoven)-欢乐颂(Ode an die Freude)...
  8. 用网页服务器实现钢琴弹奏(使用Wizwiki-W7500)
  9. 表格识别1-使用python-opencv实现表格识别
  10. oracle和mysql的mod函数