python下载m3u8文件视频
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文件视频相关推荐
- python下载m3u8视频_使用python 下载m3u8格式视频,并使用ffmpeg 合成视频
使用python 下载m3u8格式视频,并合成 # -*- coding: utf-8 -*- # Created on 2018/07/26 import os import requests &q ...
- Python下载M3U8加密视频示例
大家好,我是小小明. 最近看到几个视频网站的地址依然是m3u8格式,不禁有了使用python进行下载的想法,虽然下载m3u8格式视频的工具很多,但如果我们自行编码就能应对更多的情况. 关于m3u8的基 ...
- python下载大文件mp4_Python 下载 m3u8 格式视频
Python requests 下载 m3u8 格式 视频 最近爬取一个视频网站,遇到 m3u8 格式的视频需要下载. 抓包分析,视频文件是多个 ts 文件,什么是 ts文件,请去百度吧: 附图:抓包 ...
- python多线程下载视频_python 实现多线程下载m3u8格式视频并使用fmmpeg合并
电影之类的长视频好像都用m3u8格式了,这就导致了多线程下载视频的意义不是很大,都是短视频,线不线程就没什么意义了嘛. 我们知道,m3u8的链接会下载一个文档,相当长,半小时的视频,应该有接近千行ts ...
- python爬取下载m3u8加密视频,原来这么简单!
1.前言 爬取视频的时候发现,现在的视频都是经过加密(m3u8),不再是mp4或者avi链接直接在网页显示,都是经过加密形成ts文件分段进行播放. 今天就教大家如果通过python爬取下载m3u8加密 ...
- 脚本工具之下载M3U8文件类型的完整视频二-优酷
上一篇文章<脚本工具之下载M3U8文件类型的完整视频>分享了鹅厂视频获取方法,今天分享一个优酷视频下载方法. 依赖说明 运行环境: Python3环境 内置播放命令: ffplay (需要 ...
- python 下载m3u8视频
有一个朋友,通过一个网站(https://leetcode-cn.com/problems/course-schedule/solution/ke-cheng-biao-by-leetcode-sol ...
- 【原创】M3U8文件视频下载工具
简单讲一下开发思路,是我个人用易语言写的,可能会报毒,但其实没有任何后门! 1.下载m3u8文件,打开并解析TS资源(关于如何解析,百度有很多文章) 2.多线程下载所有TS资源 3.提供一个可以合并所 ...
- 下载m3u8加密视频的一些经验和小细节
这里有一个神器,使用非常方便,不用看下边的了 链接 一.下载ts分片 1.桌面上建立一个文件夹 2.下载index.m3u8,查看多少个ts分片 3.idm下载ts分片到该文件夹 4.复制刚才的ind ...
- python m3u8 github_GitHub - hwsyy/M3U8ParserTools: python 实现 M3U8文件的解析功能
M3U8ParserTools python是一个强大的工具,我们可以用python来帮忙处理很多能流程化完成的东西. python 解析xlsx 文件 python 归类url类型 python 解 ...
最新文章
- 毛坦厂中学是“高考工厂”?白岩松:我做不出嘲讽它的事情!
- MQTT发布消息核心流程之一
- Eclipse中最常用的热键
- 《Java 核心技术卷1 第10版》学习笔记------Object类的 equals 方法
- Feign接口 多线程问题
- 从0开始写一个基于Flutter的开源中国客户端(7)——App网络请求和数据存储
- RQNOJ 34 紧急援救
- 快让你的App分20亿吧!
- 1.Linux系统编程-进程
- Win10 LTSC版如何安装应用商店Microsoft Store
- Sql Server专题三:SQL操作与技巧
- 蛇形填数(语言:C语言)
- 最近刷爆朋友圈的“召唤神龙”
- JAVA复健篇01_基本概念
- 数字冰雹 数字孪生城市智能运营中心(IOC)可视化决策系统
- ecshop导入淘宝助理导出的数据(出现乱码)
- 【小技巧】如何安装下载MATLAB最新的工具箱
- 亲民的双机位手机游戏直播方案
- html5选择器优先级,css选择器优先级怎么比较
- JVM中的新生代和老年代