当前位置:   article > 正文

Python 神器:一键下载 M3U8 并转换为 MP4_python下载m3u8

python下载m3u8

在这个数字时代,我们经常在网页上遇到各种精彩的视频,但往往只能观看而无法下载。今天,我将向大家介绍如何使用 Python 自动下载网页中的 M3U8 链接,并将其转换为 MP4 格式,让你轻松保存喜欢的视频!

一、准备工作

首先,确保你已经安装了 ffmpeg。如果还没有安装,可以通过以参考这里安装:https://wizops.net/archives/202404/323.html

二、代码流程

  • 下载 M3U8 文件保存到临时目录。
  • 下载 key 文件保存到临时目录。
  • 生成本地 M3U8 文件内容保存到临时目录。
  • 下载 ts 文件保存到临时目录下的index目录。
  •  使用ffmpeg将m3u8转换成mp4文件

三、代码实现

  1. import os
  2. import urllib3
  3. import requests
  4. import subprocess
  5. from m3u8 import M3U8
  6. from tenacity import retry, wait_random, stop_after_attempt
  7. from gevent.pool import Pool
  8. urllib3.disable_warnings()
  9. pool = Pool(10)
  10. @retry(stop=stop_after_attempt(3), wait=wait_random(2, 5))
  11. def request(url):
  12. """发送请求"""
  13. try:
  14. res = requests.get(url, verify=False, timeout=5)
  15. return res
  16. except Exception as e:
  17. print(url, e)
  18. raise e
  19. def download_segment(url, path):
  20. """下载ts文件"""
  21. filename = url.split("/")[-1]
  22. file = os.path.join(path, filename)
  23. if os.path.exists(file):
  24. return
  25. res = request(url)
  26. with open(file, "wb")as f:
  27. f.write(res.content)
  28. def convert_mp4(path, output):
  29. # 使用FFmpeg将local.m3u8转换为一个MP4文件 ffmpeg -allowed_extensions ALL -i index.m3u8 -c copy xxx.mp4
  30. # m3u8文件中有key需要带参数-allowed_extensions ALL
  31. subprocess.call(['ffmpeg', '-allowed_extensions', 'ALL', '-i', 'local.m3u8', '-c', 'copy', output], cwd=path)
  32. def download_m3u8(url, path, output):
  33. """
  34. 下载单个m3u8主程序
  35. url: m3u8链接url
  36. path: 单个m3u8目录
  37. output: 转换输出文件路径名
  38. """
  39. base_url = url.rsplit("/", 1)[0]
  40. # 创建目录
  41. segment_dir = os.path.join(path, "index")
  42. if not os.path.exists(segment_dir):
  43. os.makedirs(segment_dir)
  44. # 下载M3U8文件
  45. m3u8_file_name = os.path.join(path, "index.m3u8")
  46. res = request(url)
  47. with open(m3u8_file_name, "w", encoding="utf-8")as f:
  48. f.write(res.text)
  49. # 解析M3U8文件
  50. m3u8_obj = M3U8(res.text)
  51. print(m3u8_obj.keys)
  52. # 下载key文件
  53. for item in m3u8_obj.keys:
  54. if item:
  55. key_url = item.uri if item.uri.startwith("http") else f"{base_url}/{item.uri}"
  56. key_file_name = os.path.join(path, item.uri)
  57. res = request(key_url)
  58. with open(key_file_name, "w", encoding="utf-8")as f:
  59. f.write(res.text)
  60. segments = []
  61. # 生成新的本地M3U8文件内容
  62. for segment in m3u8_obj.segments:
  63. segments.append(segment.uri)
  64. segment.uri = "index/" + segment.uri.split("/")[-1]
  65. # 保存M3U8文件
  66. local_file_name = os.path.join(path, "local.m3u8")
  67. with open(local_file_name, 'w') as f:
  68. f.write(m3u8_obj.dumps())
  69. # 下载ts文件
  70. for url in segments:
  71. pool.spawn(download_segment, url, segment_dir)
  72. pool.join()
  73. # ts文件下载完成, 转换成mp4文件
  74. if len(segments) == len(os.listdir(segment_dir)):
  75. convert_mp4(path, output)
  76. if __name__ == "__main__":
  77. url = "https://v3.mstopq.com/202302/26/E92zcVVNkT1/video/1000k_0X720_64k_25/hls/index.m3u8"
  78. cur_path = os.path.abspath(os.path.dirname(__file__))
  79. path = os.path.join(cur_path, "终结者创世纪_tmp")
  80. output = os.path.join(cur_path, "终结者创世纪.mp4")
  81. download_m3u8(url, path, output)

三、注意事项

  • 确保已经安装了 ffmpeg,并且在系统路径中可以访问到。
  • 输出路径必须存在,否则可能会出现错误。
  • 根据实际情况,可能需要根据 M3U8 文件的具体内容调整 ffmpeg 命令的参数。

通过这个简单的示例,你可以使用 Python 自动下载网页中的 M3U8 链接并将其转换为 MP4 格式。现在,你可以轻松保存喜欢的视频,随时随地观看啦!希望这个技巧对你有所帮助。如果有任何问题或建议,欢迎在评论中留言!

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小舞很执着/article/detail/978649
推荐阅读
相关标签
  

闽ICP备14008679号