1.m3u8是什么

m3u8是苹果公司推出的视频播放标准,是基于HTTP的流媒体网络传输协议(HLS)。HLS是把整个流分成一个个小的基于 HTTP 的文件来下载。m3u8 文件实质是一个播放列表(playlist),其内部文字使用的都是 utf-8 编码。

客户端只需按顺序下载上述片段资源,依次进行播放即可。而对于直播来说,客户端需要定时重新请求该 m3u8 文件,看下是否有新的片段数据需要进行下载并播放。

2.下载视频

知道原理开始分流下载片段。其中有些网站的ts文件是采用AES方式进行加密,所以需要对其进行解密。因而我们需要去读取这个key文件,拿取密钥。
代码如下:

import m3u8
import requests
import os
import re
from Crypto.Cipher import AES
import glob
import concurrent.futures
import time
from concurrent.futures import as_completedheaders = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.82 Safari/537.36"
}#正则表达判断是否为网站地址
def reurl(url):pattern = re.compile(r'^((https|http|ftp|rtsp|mms)?:\/\/)[^\s]+')m=pattern.search(url)if m is None:return Falseelse:return True#获取密钥
def getKey(keystr,url):keyinfo= str(keystr)method_pos= keyinfo.find('METHOD')comma_pos = keyinfo.find(",")method = keyinfo[method_pos:comma_pos].split('=')[1]uri_pos = keyinfo.find("URI")quotation_mark_pos = keyinfo.rfind('"')key_url = keyinfo[uri_pos:quotation_mark_pos].split('"')[1]if reurl(key_url) == False:key_url = url.rsplit("/", 1)[0] + "/" + key_urlres = requests.get(key_url,headers=headers)key = res.contentprint(method)print(key.decode('utf-8'))return method, key#下载文件
#down_url:ts文件地址
#url:*.m3u8文件地址
#decrypt:是否加密
#down_path:下载地址
#key:密钥
def download(down_url,url,decrypt,down_path,key):if reurl(down_url) == False:filename = down_urldown_url = url.rsplit("/", 1)[0] + "/" + down_urlelse:filename = down_url.rsplit("/", 1)[1]try:res = requests.get(down_url, stream=True, verify=False,headers=headers)except Exception as e:print(e)returndown_ts_path = down_path+"/{0}".format(filename)if decrypt:cryptor =  AES.new(key, AES.MODE_CBC, key)with open(down_ts_path,"wb+") as file:for chunk in res.iter_content(chunk_size=1024):if chunk:if decrypt:file.write(cryptor.decrypt(chunk))else:file.write(chunk)#合并ts文件
#dest_file:合成文件名
#source_path:ts文件目录
#ts_list:文件列表
#delete:合成结束是否删除ts文件
def merge_to_mp4(dest_file, source_path,ts_list, delete=False):files = glob.glob(source_path + '/*.ts')if len(files)!=len(ts_list):print("文件不完整!")returnwith open(dest_file, 'wb') as fw:for file in ts_list:with open(source_path+"/"+file, 'rb') as fr:fw.write(fr.read())if delete:os.remove(file)def main():url = "https://index.m3u8"#使用m3u8库获取文件信息video = m3u8.load(url)#设置下载路径down_path="tmp"#设置是否加密标志decrypt = False#ts列表ts_list=[]#判断是否加密if video.keys[0]  is not None:method,key =getKey(video.keys[0],url)decrypt = True#判断是否需要创建文件夹if not os.path.exists(down_path):os.mkdir(down_path)#把ts文件名添加到列表中for filename  in video.segments:if reurl(filename.uri):ts_list.append(filename.uri.rsplit("/", 1)[1])else:ts_list.append(filename.uri)#开启线程池with concurrent.futures.ThreadPoolExecutor() as executor:obj_list = []begin = time.time()#记录线程开始时间for i in range(len(video.segments)):obj = executor.submit(download,video.segments[i].uri,url,decrypt,down_path,key)obj_list.append(obj)#查看线程池是否结束for future in as_completed(obj_list):data = future.result()print(data)merge_to_mp4('result.mp4', down_path,ts_list)#合并ts文件times = time.time() - begin #记录线程完成时间print(times)if __name__ == "__main__":main()

python下载m3u8文件视频相关推荐

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

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

  2. Python下载M3U8加密视频示例

    大家好,我是小小明. 最近看到几个视频网站的地址依然是m3u8格式,不禁有了使用python进行下载的想法,虽然下载m3u8格式视频的工具很多,但如果我们自行编码就能应对更多的情况. 关于m3u8的基 ...

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

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

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

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

  5. python爬取下载m3u8加密视频,原来这么简单!

    1.前言 爬取视频的时候发现,现在的视频都是经过加密(m3u8),不再是mp4或者avi链接直接在网页显示,都是经过加密形成ts文件分段进行播放. 今天就教大家如果通过python爬取下载m3u8加密 ...

  6. 脚本工具之下载M3U8文件类型的完整视频二-优酷

    上一篇文章<脚本工具之下载M3U8文件类型的完整视频>分享了鹅厂视频获取方法,今天分享一个优酷视频下载方法. 依赖说明 运行环境: Python3环境 内置播放命令: ffplay (需要 ...

  7. python 下载m3u8视频

    有一个朋友,通过一个网站(https://leetcode-cn.com/problems/course-schedule/solution/ke-cheng-biao-by-leetcode-sol ...

  8. 【原创】M3U8文件视频下载工具

    简单讲一下开发思路,是我个人用易语言写的,可能会报毒,但其实没有任何后门! 1.下载m3u8文件,打开并解析TS资源(关于如何解析,百度有很多文章) 2.多线程下载所有TS资源 3.提供一个可以合并所 ...

  9. 下载m3u8加密视频的一些经验和小细节

    这里有一个神器,使用非常方便,不用看下边的了 链接 一.下载ts分片 1.桌面上建立一个文件夹 2.下载index.m3u8,查看多少个ts分片 3.idm下载ts分片到该文件夹 4.复制刚才的ind ...

  10. python m3u8 github_GitHub - hwsyy/M3U8ParserTools: python 实现 M3U8文件的解析功能

    M3U8ParserTools python是一个强大的工具,我们可以用python来帮忙处理很多能流程化完成的东西. python 解析xlsx 文件 python 归类url类型 python 解 ...

最新文章

  1. 毛坦厂中学是“高考工厂”?白岩松:我做不出嘲讽它的事情!
  2. MQTT发布消息核心流程之一
  3. Eclipse中最常用的热键
  4. 《Java 核心技术卷1 第10版》学习笔记------Object类的 equals 方法
  5. Feign接口 多线程问题
  6. 从0开始写一个基于Flutter的开源中国客户端(7)——App网络请求和数据存储
  7. RQNOJ 34 紧急援救
  8. 快让你的App分20亿吧!
  9. 1.Linux系统编程-进程
  10. Win10 LTSC版如何安装应用商店Microsoft Store
  11. Sql Server专题三:SQL操作与技巧
  12. 蛇形填数(语言:C语言)
  13. 最近刷爆朋友圈的“召唤神龙”
  14. JAVA复健篇01_基本概念
  15. 数字冰雹 数字孪生城市智能运营中心(IOC)可视化决策系统
  16. ecshop导入淘宝助理导出的数据(出现乱码)
  17. 【小技巧】如何安装下载MATLAB最新的工具箱
  18. 亲民的双机位手机游戏直播方案
  19. html5选择器优先级,css选择器优先级怎么比较
  20. JVM中的新生代和老年代

热门文章

  1. 数学建模(NO.7相关系数—假设检验)
  2. 建立内网Windows补丁服务器
  3. 【APP推荐】手机制作微电影
  4. flv转换mp4最简单方法
  5. CentOS8 多网卡BondingTeam
  6. 新华财经•专访 | 来自大洋彼岸对区块链大势的深度解读
  7. 第11章:使用Apriori算法进行关联分析(从频繁项集中挖掘关联规则)
  8. DataSource接口,一个被大多数程序员忽略的接口
  9. Eureka的自我保护机制
  10. 什么是服务器CC攻击,被CC攻击了服务器怎么防护?