python 实现多线程下载加密m3u8格式视频,使用FFmpeg合并
如果你要下载的m3u8文件未加密:
请移步:https://blog.csdn.net/s_kangkang_A/article/details/103071822
上次做完了没加密的,再次记一下加密的怎么做。
其实效率不高,看看就知道了,可能是线程没开够,也可能是,解密浪费时间。
代码:
import datetime
import os
import re
import threading
import time
from queue import Queue
import requests
from Crypto.Cipher import AES# 传入链接,完成写文件操作及获取key链接
def parse(url, headers, base_url):resp = requests.get(url, headers=headers)# 匹配key链接key_url = re.search('"(.*?key.key)"', resp.text).group(1).strip()# print(key_url)m3u8_text = resp.text# print(m3u8_text)# 按行拆分m3u8文档ts_queue = Queue(10000)lines = m3u8_text.split('\n')s = len(lines)# 找到文档中含有ts字段的行concatfile = 'cache/' + "zzz" + '.txt'for i, line in enumerate(lines):# 我找的链接里,m3u8文件里是js链接,需要替换if '.js' in line:line = re.sub('\.js', '.ts', line)if 'http' in line:# print("ts>>", line)ts_queue.put(line)filename = re.search('([a-zA-Z0-9-_]+\.ts)', line).group(1).strip()# 一定要先写文件,因为线程的下载是无序的,文件无法按照# 123456。。。去顺序排序,而文件中的命名也无法保证是按顺序的# 这会导致下载的ts文件无序,合并时,就会顺序错误,导致视频有问题。open(concatfile, 'a+').write("file %s\n" % filename)print("\r", '文件写入中', i, "/", s, end="", flush=True)else:if '.ts' in line:if 'http' in line:# print("ts>>", line)ts_queue.put(line)else:line = base_url + linets_queue.put(line)# print('ts>>',line)filename = re.search('([a-zA-Z0-9-_]+\.ts)', line).group(1).strip()# 一定要先写文件,因为线程的下载是无序的,文件无法按照# 123456。。。去顺序排序,而文件中的命名也无法保证是按顺序的# 这会导致下载的ts文件无序,合并时,就会顺序错误,导致视频有问题。open(concatfile, 'a+').write("file %s\n" % filename)print("\r", '文件写入中', i, "/", s, end="", flush=True)return ts_queue, concatfile, key_url# 传入key链接,对key进行相关操作
def get_key(key_url):k = requests.get(key_url, headers=headers)key = k.contentcryptor = AES.new(key, AES.MODE_CBC, key)return cryptor# 下载操作
def down(ts_queue, headers, cryptor):while not ts_queue.empty():url = ts_queue.get()filename = re.search('([a-zA-Z0-9-_]+\.ts)', url).group(1).strip()try:requests.packages.urllib3.disable_warnings()resp = requests.get(url, headers=headers)with open('cache/' + filename, 'ab+') as f:data = cryptor.decrypt(resp.content)f.write(data)print("\r", '任务文件 ', filename, ' 下载成功', end="", flush=True)except:print('任务文件 ', filename, ' 下载失败')ts_queue.put(url)# 合并操作
def merge(concatfile, name):try:path = 'cache/' + name + '.mp4'# command = 'ffmpeg -y -f concat -i %s -crf 18 -ar 48000 -vcodec libx264 -c:a aac -r 25 -g 25 -keyint_min 25 -strict -2 %s' % (concatfile, path)command = 'ffmpeg -y -f concat -i %s -bsf:a aac_adtstoasc -c copy %s' % (concatfile, path)os.system(command)print('视频合并完成')except:print('合并失败')# 565 1280# 删除操作
def remove(concatfile):dir = 'cache/'for line in open(concatfile):line = re.search('file (.*?\.ts)', line).group(1).strip()os.remove(dir + line)print("ts文件全部删除")try:os.remove(concatfile)print('文件删除成功')except:print('文件删除失败')if __name__ == '__main__':name = input('请输入视频名称:')# 时效性链接url = 'https://meiju8.qfxmj.com/20191112/xVEwe432/2000kb/hls/index.m3u8?wsSecret=e16e458821a72c67fb51d57287de91e5&wsTime=1574232518&watch=ae6f4caa08e521511949081bd4dd75f9'headers = {'origin': 'https://ww4.hanjutv.com','referer': 'https://ww4.hanjutv.com/index.php?path=https://meiju8.qfxmj.com/20191112/xVEwe432/index.m3u8&f=ck_m3u8','user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.97 Safari/537.36'}start = datetime.datetime.now().replace(microsecond=0)print("文件开始写入")# 需要就写,不需要不写# 该网站不需要base_url = Nonets_queue, concatfile, key_url = parse(url, headers, base_url)print('\n')print("文件写入结束")# 把key链接传给方法解析key值cryptor = get_key(key_url)# 获取队列元素数量num = ts_queue.qsize()# 根据数量来开线程数,每五个元素一个线程# 最大开到50个print("下载任务开始")if num > 5:t_num = num // 5else:t_num = 1if t_num > 50:t_num = 50threads = []for i in range(t_num):t = threading.Thread(target=down, name='th-' + str(i),kwargs={'ts_queue': ts_queue, 'headers': headers, 'cryptor': cryptor})t.setDaemon(True)threads.append(t)for t in threads:time.sleep(0.4)t.start()for t in threads:t.join()print('\n')print("下载任务结束")end = datetime.datetime.now().replace(microsecond=0)print('写文件及下载耗时:' + str(end - start))merge(concatfile, name)remove(concatfile)over = datetime.datetime.now().replace(microsecond=0)print('合并及删除文件耗时:' + str(over - end))print("所有任务结束")print('任务总时长:', over - start)
emmm,好像没什么特别要说的,主要是这个网站比较特别,有兴趣可以看看。
效果:
才200MB,五分钟多,效率低的很。
我比ffmpeg快了接近三分钟,哈哈,毕竟用了人家,还是要比人家有点效率才行啊
python 实现多线程下载加密m3u8格式视频,使用FFmpeg合并相关推荐
- 怎么下载m3u8格式视频?Python爬取A站m3u8格式视频案例讲解
前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理. 本篇文章流程 一. 数据来源分析 确定需求 (确定要爬的内容是什么?).只有知道数据要的是什 ...
- python带你采集某m3u8格式视频~带你任意下载
前言
- python多线程下载视频_python 实现多线程下载m3u8格式视频并使用fmmpeg合并
电影之类的长视频好像都用m3u8格式了,这就导致了多线程下载视频的意义不是很大,都是短视频,线不线程就没什么意义了嘛. 我们知道,m3u8的链接会下载一个文档,相当长,半小时的视频,应该有接近千行ts ...
- 【python】多线程下载m3u8分段视频
1.说明 m3u8是一种传输数据的方式,比如说一集20分钟的完整视频被分割成一千多段一两秒的小视频,客户端播放的时候是感觉是连续,但如果你要下载这集视频,那就要把一千多个小视频全都下载然后自己拼接成一 ...
- python下载大文件mp4_Python 下载 m3u8 格式视频
Python requests 下载 m3u8 格式 视频 最近爬取一个视频网站,遇到 m3u8 格式的视频需要下载. 抓包分析,视频文件是多个 ts 文件,什么是 ts文件,请去百度吧: 附图:抓包 ...
- python下载m3u8视频_使用python 下载m3u8格式视频,并使用ffmpeg 合成视频
使用python 下载m3u8格式视频,并合成 # -*- coding: utf-8 -*- # Created on 2018/07/26 import os import requests &q ...
- Python爬取m3u8格式视频并解密ts文件合并转为mp4格式
一. m3u8是什么格式 m3u8是苹果公司推出的视频播放标准,是m3u的一种,只是编码格式采用的是UTF-8. m3u8准确来说是一种索引文件,使用m3u8文件实际上是通过它来解析对应的放在服务器上 ...
- 如何优雅的批量下载m3u8 格式视频
我们去很多网站上 去下载视频,解析出的地址 是m3u8格式视频, 使用 普通的下载方式下载就是一个m3u8文件.里面装的是一段一段的视频.一方面,不做特殊处理播放器可能播放不了,另一方面该格式可能是加 ...
- python爬取m3u8格式视频
python爬取m3u8格式视频 m3u8原理 脚本环境 爬取步骤 步骤的具体实现 python细节处理说明 参考代码 m3u8原理 当我们在网页播放视频时,网页向服务器发起一个以.m3u8结尾的连接 ...
最新文章
- idea springmvc_SSM三大框架使用Maven快速搭建整合(SpringMVC+Spring+Mybatis)
- 桌面支持--ZWMECH软件卸载工具
- HDU 2065 红色病毒问题(生成函数)
- 分支机构L2L *** 到总部再PAT通过专线到合作伙伴(SVTI建立***)
- 解决: Sudamod/CM-13.0 源代码出现 Fatal: duplicate project .....问题
- Bootloader和App例程,实现M0基于UART的IAP升级功能,升级过程中通信中断,重新上电后Bootloader仍可运行。实现平台:STM32F030R8
- VS发布 错误 未能将文件 复制到
- webpack文件系统缓存
- RIP路由协议基本配置
- 大数据可视化技术挑战和措施
- 手机通话记录统计分析
- 路由器2.4G和5G有什么区别
- 固定不动的层(兼容IE6)
- 系统思考正反馈之马太效应
- Solaris 中文命令
- 印刻出版 盛可以 限量《死亡賦格》
- 数据处理之连续数据离散化
- 计算机网络连接设备不见了,计算机本地连接找不到了(不见了)如何修复
- 使用SqlSugar连接多个数据库(sqlserver,sqlite,mysql)
- 公众号增粉方式有哪些,最有效的是哪一种?
热门文章
- Java-贷款计算器小程序
- 分析仪器宜选用微型真空水泵作采样泵
- 面试题引出的知识点整理
- 拉里·埃里森 耶鲁大学演讲内容
- COPC®认证—Callnovo顾客体验运营优秀实践7.0培训圆满结业
- 计算机会计课程试题及答案,会计证《初级会计电算化》上机考试试题(含答案)...
- [知了堂学习笔记]_Java中线程的学习(一)
- 学生信息管理系统(成绩统计)Java课设
- MPlayerX——MAC OS 最好用的播放器
- 同方威视智能安检为北京大兴国际机场安全护航