如果你要下载的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合并相关推荐

  1. 怎么下载m3u8格式视频?Python爬取A站m3u8格式视频案例讲解

    前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理. 本篇文章流程 一. 数据来源分析 确定需求 (确定要爬的内容是什么?).只有知道数据要的是什 ...

  2. python带你采集某m3u8格式视频~带你任意下载

    前言

  3. python多线程下载视频_python 实现多线程下载m3u8格式视频并使用fmmpeg合并

    电影之类的长视频好像都用m3u8格式了,这就导致了多线程下载视频的意义不是很大,都是短视频,线不线程就没什么意义了嘛. 我们知道,m3u8的链接会下载一个文档,相当长,半小时的视频,应该有接近千行ts ...

  4. 【python】多线程下载m3u8分段视频

    1.说明 m3u8是一种传输数据的方式,比如说一集20分钟的完整视频被分割成一千多段一两秒的小视频,客户端播放的时候是感觉是连续,但如果你要下载这集视频,那就要把一千多个小视频全都下载然后自己拼接成一 ...

  5. python下载大文件mp4_Python 下载 m3u8 格式视频

    Python requests 下载 m3u8 格式 视频 最近爬取一个视频网站,遇到 m3u8 格式的视频需要下载. 抓包分析,视频文件是多个 ts 文件,什么是 ts文件,请去百度吧: 附图:抓包 ...

  6. python下载m3u8视频_使用python 下载m3u8格式视频,并使用ffmpeg 合成视频

    使用python 下载m3u8格式视频,并合成 # -*- coding: utf-8 -*- # Created on 2018/07/26 import os import requests &q ...

  7. Python爬取m3u8格式视频并解密ts文件合并转为mp4格式

    一. m3u8是什么格式 m3u8是苹果公司推出的视频播放标准,是m3u的一种,只是编码格式采用的是UTF-8. m3u8准确来说是一种索引文件,使用m3u8文件实际上是通过它来解析对应的放在服务器上 ...

  8. 如何优雅的批量下载m3u8 格式视频

    我们去很多网站上 去下载视频,解析出的地址 是m3u8格式视频, 使用 普通的下载方式下载就是一个m3u8文件.里面装的是一段一段的视频.一方面,不做特殊处理播放器可能播放不了,另一方面该格式可能是加 ...

  9. python爬取m3u8格式视频

    python爬取m3u8格式视频 m3u8原理 脚本环境 爬取步骤 步骤的具体实现 python细节处理说明 参考代码 m3u8原理 当我们在网页播放视频时,网页向服务器发起一个以.m3u8结尾的连接 ...

最新文章

  1. idea springmvc_SSM三大框架使用Maven快速搭建整合(SpringMVC+Spring+Mybatis)
  2. 桌面支持--ZWMECH软件卸载工具
  3. HDU 2065 红色病毒问题(生成函数)
  4. 分支机构L2L *** 到总部再PAT通过专线到合作伙伴(SVTI建立***)
  5. 解决: Sudamod/CM-13.0 源代码出现 Fatal: duplicate project .....问题
  6. Bootloader和App例程,实现M0基于UART的IAP升级功能,升级过程中通信中断,重新上电后Bootloader仍可运行。实现平台:STM32F030R8
  7. VS发布 错误 未能将文件 复制到
  8. webpack文件系统缓存
  9. RIP路由协议基本配置
  10. 大数据可视化技术挑战和措施
  11. 手机通话记录统计分析
  12. 路由器2.4G和5G有什么区别
  13. 固定不动的层(兼容IE6)
  14. 系统思考正反馈之马太效应
  15. Solaris 中文命令
  16. 印刻出版 盛可以 限量《死亡賦格》
  17. 数据处理之连续数据离散化
  18. 计算机网络连接设备不见了,计算机本地连接找不到了(不见了)如何修复
  19. 使用SqlSugar连接多个数据库(sqlserver,sqlite,mysql)
  20. 公众号增粉方式有哪些,最有效的是哪一种?

热门文章

  1. Java-贷款计算器小程序
  2. 分析仪器宜选用微型真空水泵作采样泵
  3. 面试题引出的知识点整理
  4. 拉里·埃里森 耶鲁大学演讲内容
  5. COPC®认证—Callnovo顾客体验运营优秀实践7.0培训圆满结业
  6. 计算机会计课程试题及答案,会计证《初级会计电算化》上机考试试题(含答案)...
  7. [知了堂学习笔记]_Java中线程的学习(一)
  8. 学生信息管理系统(成绩统计)Java课设
  9. MPlayerX——MAC OS 最好用的播放器
  10. 同方威视智能安检为北京大兴国际机场安全护航