当前位置: 首页 > news >正文

python下载M3U8视频脚本

安装依赖

pip install m3u8 requests

程序

import os import time import requests import m3u8 from urllib.parse import urljoin from Crypto.Cipher import AES from Crypto.Util.Padding import pad def download_m3u8_video(url, save_name='output.mp4'): headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)'} print("📡 正在解析 m3u8 播放列表...") try: playlist = m3u8.load(uri=url, headers=headers) except Exception as e: print(f"❌ 解析失败: {e}") return # 检查是否存在 AES 加密 key, iv = None, None if playlist.keys and playlist.keys[-1] is not None: key_info = playlist.keys[-1] key_uri = key_info.uri # 【核心修复】:如果密钥是相对路径,使用 urljoin 拼接完整的 URL if not key_uri.startswith('http'): key_uri = urljoin(url, key_uri) print(f"🔑 检测到加密,正在获取完整密钥链接: {key_uri}") # 获取密钥内容(建议加上与下载视频相同的 headers,防止防盗链拦截) key_resp = requests.get(key_uri, headers=headers, timeout=15) key_resp.raise_for_status() key = key_resp.content # 获取 IV 向量,如果没有则默认使用全零的 16 字节 iv = key_info.iv if iv: iv = bytes.fromhex(iv.replace('0x', '')) else: iv = b'\x00' * 16 total = len(playlist.segments) print(f"✅ 解析成功,共 {total} 个片段,开始下载并合并...") start_time = time.time() size = 0 with open(save_name, 'wb') as f: for i, seg in enumerate(playlist.segments, 1): try: # 同样确保 TS 分片也是完整 URL ts_url = seg.absolute_uri r = requests.get(ts_url, headers=headers, timeout=15) r.raise_for_status() data = r.content # 如果有密钥,进行 AES 解密 if key: cipher = AES.new(key=key, mode=AES.MODE_CBC, iv=iv) data = cipher.decrypt(pad(data, AES.block_size)) f.write(data) size += len(data) # 打印进度 elapsed = time.time() - start_time speed = size / elapsed / 1024 / 1024 print(f"\r⏳ 进度: {i}/{total} | 已下载: {size / 1024 / 1024:.2f}MB | 速度: {speed:.2f}MB/s", end='') except Exception as e: print(f"\n❌ 第 {i} 个片段下载失败: {e}") continue print(f"\n🎉 视频已成功保存为: {save_name}") if __name__ == '__main__': M3U8_URL = "xxx" download_m3u8_video(M3U8_URL, 'my_video.mp4')
http://www.jsqmd.com/news/1092902/

相关文章:

  • 【单片机毕业设计】基于 STM32 的超重声光报警电子秤设计与实现,基于 STM32 的阈值式重量监测报警系统设计(013701)
  • AI截图工具免费下载,基于DeepSeek的OCR截图软件支持Mac和Win
  • 三列布局三大方案对比总结
  • TI TPIC7710EVM评估模块:汽车EPB系统ASIC驱动与电机控制实战解析
  • Burp Suite实战:验证码场景下的自动化渗透测试与绕过技术
  • 专业iOS激活锁绕过工具applera1n:5分钟恢复iPhone 6s-X使用权限
  • 单板测试正常,整机运行异常:6 类系统排查清单
  • 关于我的第十次web作业
  • YOLO轻量化与部署优化- 第75篇:ONNX导出与优化:从PyTorch到ONNX部署
  • 传统潮流款库存一定会亏损,编程潮流款二手转售,改款二次销售收益模型,降低滞销亏损。
  • PilotGo-plugin-llmops API全解析:轻松集成与二次开发
  • ABB工业机器人编程基础(十三)功能程序(FUNC)
  • 合肥第三期《AI产品经理训练营》授课心得
  • 考四级的资料|过四级必备资料书|英语六级备考资料
  • MySQL数据库期末复习②
  • AI渐进编程之七:让 AI 先读项目地图再动手
  • 第八、九次作业
  • 2026年现在什么证的含金量高?普通人跨行与职场进阶考证指南
  • 英语四级考资料|四级考试英语资料|英语四级考试资料
  • 1234321
  • SQLModel零基础教程(五)- 工程化封装 迁移工具
  • 2026学生降AI率工具盘点: 学术打磨+逻辑优化哪家强?
  • 第八次作业和第九次作业
  • 《妈妈,我失业了》值得被认真放进中文歌单
  • 使用Hermes 排查OpenClaw 从 5.12 升级到 6.10 的故障
  • Linux基础指令(一):命令行入门
  • 【小白也能轻松玩转龙虾】虾壳云一键部署办公增效,批量文件处理 OpenClaw v2.7.9 教学(附最新安装包)
  • 万能导 Wandao:知识星球项目资料一键导出,不用再一篇篇复制了
  • web应用技术第九次作业
  • 【ChatGPT结构化提示词黄金法则】:20年AI工程实战提炼的7大不可绕过的设计范式