最新要闻
- 全球今头条!辽宁男篮队员韩德君籍贯(韩德君真实身高)
- 总投入8700多万元 南安一家医院预计年底前投用-最新消息
- 40年传奇落幕:《夺宝奇兵:命运转盘》国内定档6月30日 环球热头条
- 618遇上毕业季:这三款高性价比的华硕无畏轻薄本 你值得拥有
- 全球百事通!2023新一线城市名单官宣: 北方仅4城上榜 有你的家乡吗?
- 神舟十六号与空间站完成交会对接:3名航天员即将进入天和核心舱|每日看点
- 猪场夜间电闸跳闸 高温致五千头猪死亡:损失上千万|每日快播
- 天天快报!刮腻子和刮完腻子有什么区别 刮大白和刮腻子区别
- 每日精选:当AI开始制药:研发周期可缩短一半,仍无任何新药面世
- 老司机注意!昆明警方紧盯酒驾醉驾等严重交通违法行为
- 6989元起 华硕灵耀13 2023深湖蓝配色上架:2.8K OLED屏
- 世界观热点:业务能力超强!两只边牧协同驱赶数百只羊:无一走散
- 笔记本为何还没充满就不再充电了?原因揭开|微动态
- 曾拒绝生产SUV 法拉利:并不在乎自动驾驶
- 一代回忆!快播公司破产注销
- 直播卖酒用“茅台酒厂”误导消费者,北京福气连连公司被罚30万_今日快讯
手机
iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
- 警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- 男子被关545天申国赔:获赔18万多 驳回精神抚慰金
- 3天内26名本土感染者,辽宁确诊人数已超安徽
- 广西柳州一男子因纠纷杀害三人后自首
- 洱海坠机4名机组人员被批准为烈士 数千干部群众悼念
家电
Python 实现 m3u8 视频下载_全球消息
Python 实现 m3u8 视频下载
m3u8 是一种基于文本的媒体播放列表文件格式,通常用于指定流媒体播放器播放在线媒体流。它是一个简单的文本文件,其中包含多个由 URI 引用的媒体资源文件的 URL。m3u8 文件通常包含多个 ts 文件的链接,这些 ts 文件是实际的视频和音频数据文件,通常是通过 HTTP 协议传输。
ts 文件是一种流媒体传输格式,是 MPEG-2 传输流(MPEG-2 Transport Stream)的缩写。ts 文件通常用于存储视频、音频和字幕等媒体数据,是流媒体传输的基本单位。在 m3u8 文件中,ts 文件通常是通过 URI 引用的方式来指定的,播放器会根据 m3u8 文件中的 ts 文件链接,依次请求并下载 ts 文件,然后将其组合成完整的视频流进行播放。
因此,m3u8 文件和 ts 文件在流媒体播放领域密切相关,m3u8 文件是流媒体的播放列表,而 ts 文件是实际的媒体数据文件。m3u8 文件中包含了多个 ts 文件的链接,播放器会根据 m3u8 文件中的 ts 文件链接,依次请求并下载 ts 文件,然后将其组合成完整的视频流进行播放。这种方式可以充分利用网络带宽,提高流媒体的播放效率和质量。同时,m3u8 文件还可以通过定义不同的码率和分辨率等参数,实现适应不同网络环境和设备的自适应流媒体播放。
【资料图】
基础实现
以下是使用 Python 下载 m3u8 视频并保存为 mp4 的示例代码:
import requestsimport osdef download_m3u8_video(url, file_path): r = requests.get(url) if r.status_code != 200: print("m3u8视频下载链接无效") return False m3u8_list = r.text.split("\n") m3u8_list = [i for i in m3u8_list if i and i[0] != "#"] ts_list = [] for ts_url in m3u8_list: ts_url = url.rsplit("/", 1)[0] + "/" + ts_url ts_list.append(ts_url) with open(file_path, "wb") as f: for ts_url in ts_list: r = requests.get(ts_url) if r.status_code == 200: f.write(r.content) print("m3u8视频下载完成") return Truedef convert_ts_to_mp4(ts_file_path, mp4_file_path): os.system(f"ffmpeg -i {ts_file_path} -c copy {mp4_file_path}")if __name__ == "__main__": url = "输入m3u8视频下载链接" ts_file_path = "输入ts文件保存路径" mp4_file_path = "输入mp4文件保存路径" download_m3u8_video(url, ts_file_path) convert_ts_to_mp4(ts_file_path, mp4_file_path)
在这个示例中,download_m3u8_video
函数用于下载 m3u8 视频,convert_ts_to_mp4
函数用于将下载的 ts 文件转换为 mp4 文件。首先,使用 requests 库下载 m3u8 文件,并解析出其中的 ts 文件链接。然后,遍历 ts 文件链接列表,使用 requests 库下载每个 ts 文件,并将其写入到一个文件中。最后,使用 ffmpeg 工具将下载的 ts 文件转换为 mp4 文件。需要注意的是,为了使用 ffmpeg 工具,需要在系统中安装 ffmpeg,并将其添加到环境变量中。
实际应用中,可以根据具体情况对代码进行调整和优化,例如增加异常处理、优化下载速度等。同时,由于 m3u8 视频格式的特殊性,下载过程可能会较为耗时,需要耐心等待一段时间。
使用多线程来优化下载速度
为了优化下载速度,可以使用多线程或异步 IO 的方式来下载 m3u8 视频。以下是使用多线程下载 m3u8 视频的示例代码:
import requestsimport osimport threadingclass Downloader(threading.Thread): def __init__(self, url, ts_url, file_path): threading.Thread.__init__(self) self.url = url self.ts_url = ts_url self.file_path = file_path def run(self): r = requests.get(self.ts_url, stream=True) if r.status_code == 200: with open(self.file_path, "wb") as f: for chunk in r.iter_content(chunk_size=1024): if chunk: f.write(chunk)def download_m3u8_video(url, file_path): r = requests.get(url) if r.status_code != 200: print("m3u8视频下载链接无效") return False m3u8_list = r.text.split("\n") m3u8_list = [i for i in m3u8_list if i and i[0] != "#"] ts_list = [] for ts_url in m3u8_list: ts_url = url.rsplit("/", 1)[0] + "/" + ts_url ts_list.append(ts_url) threads = [] for i, ts_url in enumerate(ts_list): ts_file_path = file_path.rsplit(".", 1)[0] + f"_{i}.ts" thread = Downloader(url, ts_url, ts_file_path) thread.start() threads.append(thread) for thread in threads: thread.join() print("m3u8视频下载完成") return Truedef convert_ts_to_mp4(ts_file_path, mp4_file_path): os.system(f"ffmpeg -i {ts_file_path} -c copy {mp4_file_path}")if __name__ == "__main__": url = "输入m3u8视频下载链接" ts_file_path = "输入ts文件保存路径" mp4_file_path = "输入mp4文件保存路径" download_m3u8_video(url, ts_file_path) convert_ts_to_mp4(ts_file_path, mp4_file_path)
在这个示例中,定义了一个 Downloader
类,用于下载每个 ts 文件。在 Downloader
类中,使用 requests 库的 stream
参数将下载进度分块,每次下载 1024 个字节,然后写入到文件中。在 download_m3u8_video
函数中,使用多线程的方式同时下载多个 ts 文件,并等待所有线程下载完成后再将其合并成一个 mp4 文件。这样可以大大缩短下载时间。
需要注意的是,多线程下载可能会导致网络瓶颈,从而降低下载速度。因此,在实际应用中,需要根据具体情况选择合适的下载方式,并进行调整和优化。例如,可以使用异步 IO、协程等技术来优化下载速度。另外,为了提高下载速度,还可以使用 CDN、负载均衡、网络加速等技术来优化下载环节。
使用异步 IO 和协程来优化下载速度
Python 中的协程是一种轻量级的线程,可以在单个线程中实现并发。协程可以在遇到 I/O 操作时挂起自己,等待 I/O 操作完成后再继续执行,从而实现非阻塞 I/O 操作。在 Python 3.5 中引入的 async/await 语法可以方便地创建协程。
异步 IO是一种 I/O 模型,它的特点是在发起 I/O 操作时立即返回,而不是等待 I/O 操作完成。异步 IO 通常与事件循环结合使用,例如在 Python 中使用的 asyncio 模块。在事件循环的驱动下,异步 IO 可以实现高效的 I/O 操作,因为在等待 I/O 操作完成期间可以执行其他任务,而不需要占用 CPU 时间。
为了使用异步 IO 和协程来优化下载速度,可以使用 aiohttp 和 asyncio 库来实现。以下是使用异步 IO 和协程下载 m3u8 视频的示例代码:
import aiohttpimport asyncioimport osasync def download_ts_file(ts_url, ts_file_path): # 防止ssl报错: # aiohttp.client_exceptions.ClientConnectorCertificateError: Cannot connect to host ***.****.com:443 ssl:True # [SSLCertVerificationError: (1, "[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local # issuer certificate (_ssl.c:1123)")] conn = aiohttp.TCPConnector(ssl=False) async with aiohttp.ClientSession(connector=conn) as session: async with session.get(ts_url) as response: if response.status != 200: print(f"{ts_url} 下载失败") return False with open(ts_file_path, "wb") as f: while True: chunk = await response.content.read(1024) if not chunk: break f.write(chunk) print(f"{ts_url} 下载完成") return Trueasync def download_m3u8_video(url, file_path): # 防止ssl报错 conn = aiohttp.TCPConnector(ssl=False) async with aiohttp.ClientSession(connector=conn) as session: async with session.get(url) as response: if response.status != 200: print("m3u8视频下载链接无效") return False m3u8_text = await response.text() m3u8_list = m3u8_text.split("\n") m3u8_list = [i for i in m3u8_list if i and i[0] != "#"] tasks = [] for i, ts_url in enumerate(m3u8_list): ts_url = url.rsplit("/", 1)[0] + "/" + ts_url ts_file_path = file_path.rsplit(".", 1)[0] + f"_{i}.ts" task = asyncio.ensure_future( download_ts_file(ts_url, ts_file_path)) tasks.append(task) await asyncio.gather(*tasks) print("m3u8视频下载完成") return Truedef convert_ts_to_mp4(ts_file_path, mp4_file_path): os.system(f"ffmpeg -i {ts_file_path} -c copy {mp4_file_path}")if __name__ == "__main__": url = "输入m3u8视频下载链接" ts_file_path = "输入ts文件保存路径" mp4_file_path = "输入mp4文件保存路径" loop = asyncio.get_event_loop() loop.run_until_complete(download_m3u8_video(url, ts_file_path)) convert_ts_to_mp4(ts_file_path, mp4_file_path)
在这个示例中,使用了 aiohttp 和 asyncio 库来实现异步 IO 和协程。定义了两个协程函数:download_m3u8_video
和 download_ts_file
。在 download_m3u8_video
函数中,使用 aiohttp 库的 ClientSession
类异步获取 m3u8 文件,并解析出其中的 ts 文件链接。然后,使用协程和异步 IO 的方式异步下载每个 ts 文件,并将其写入到本地文件中。在下载过程中,使用了异步 IO 和协程的方式,可以充分利用网络带宽,提高下载速度。
在 download_m3u8_video
函数中,使用了 async for
循环来遍历 m3u8 文件中的 ts 文件链接,并创建了一个任务列表 tasks
,用于存储异步下载的任务。然后,使用 asyncio.ensure_future
方法将每个任务添加到任务列表中。最后,使用 asyncio.gather
方法同时运行所有异步任务,等待所有任务完成后,即可完成整个 m3u8 视频的下载。
最后,使用 ffmpeg
工具将下载的 ts 文件转换为 mp4 格式的视频文件。这个步骤并不涉及异步 IO 和协程,只是为了将下载的 ts 文件转换为可用的视频文件格式。
使用协程可以充分利用网络带宽,提高下载速度。需要注意的是,在使用协程时,需要考虑到 CPU 和内存等资源的占用,避免出现资源耗尽或者死锁等问题。同时,协程的使用需要掌握一定的异步编程技巧,例如使用 async/await
关键字、协程调度等。因此,在实际应用中,需要根据具体情况进行调整和优化,以获取最佳的性能和效果。
关键词:
-
天天观点:【智能软件安全】上海道宁为您带来智能软件安全平台——Veracode,帮助您全面地保护您构建和管理地应用程序
Veracode可以全面地保护您构建和管理地应用程序,在现代软件开发生命周期的每个阶段不断发现并修复缺陷
来源: Python 实现 m3u8 视频下载_全球消息
AIGC下的低代码赛道,你我皆是拓荒人
天天观点:【智能软件安全】上海道宁为您带来智能软件安全平台——Veracode,帮助您全面地保护您构建和管理地应用程序
全球即时:商品日报(5月30日):沪锡续涨近3% 纯碱反弹驱动不足再度转跌
全球今头条!辽宁男篮队员韩德君籍贯(韩德君真实身高)
总投入8700多万元 南安一家医院预计年底前投用-最新消息
40年传奇落幕:《夺宝奇兵:命运转盘》国内定档6月30日 环球热头条
618遇上毕业季:这三款高性价比的华硕无畏轻薄本 你值得拥有
全球百事通!2023新一线城市名单官宣: 北方仅4城上榜 有你的家乡吗?
神舟十六号与空间站完成交会对接:3名航天员即将进入天和核心舱|每日看点
猪场夜间电闸跳闸 高温致五千头猪死亡:损失上千万|每日快播
天天快报!刮腻子和刮完腻子有什么区别 刮大白和刮腻子区别
【Haxe】(一)VSCode 搭建 Haxe 开发环境
什么是SSCC码
详解RocketMQ 顺序消费机制 快看点
每日精选:当AI开始制药:研发周期可缩短一半,仍无任何新药面世
【报资讯】每日机构分析:5月30日
老司机注意!昆明警方紧盯酒驾醉驾等严重交通违法行为
6989元起 华硕灵耀13 2023深湖蓝配色上架:2.8K OLED屏
世界观热点:业务能力超强!两只边牧协同驱赶数百只羊:无一走散
笔记本为何还没充满就不再充电了?原因揭开|微动态
曾拒绝生产SUV 法拉利:并不在乎自动驾驶
一代回忆!快播公司破产注销
直播卖酒用“茅台酒厂”误导消费者,北京福气连连公司被罚30万_今日快讯
如何用ReadWriteLock实现一个通用的缓存中心?|环球今热点
速读:13)流程控制语句
一文详解 Sa-Token 中的 SaSession 对象-世界百事通
世界观察:第十二单元 常用API
持球还得练练!杰伦抢七战出现8失误 NBA历史第二多 即时
预算不够免签来凑!米兰开启免签大法,夏窗欲网罗多名自由球员
史莱克七怪神装公布,小舞二次发育,宁荣荣最美,小奥烟熏妆差评-当前热门
环球消息!演唱会门票秒罄!黄牛党捞钱术升级
速看:日本专家三年研究:中学生入学得到手机脑力直接停滞在小学
天天消息!网友评新一代LCD神机Redmi Note 12T Pro:卢伟冰焊门很准
第十一单元 面向对象三:继承与多态_世界热资讯
NTP网络校时服务器 (GPS+北斗+恒温晶振)双系统设计与研究|看点
焦点简讯:[javascript/html] HTML中Location对象详解
省“春蕾计划+我的书房”项目在盐城东台启动 热文
环球资讯:从华为离职创业的天才少年刚拿了百度投资:估值被曝已超独角兽
曾遭霸凌的解说YammerS离世 DOTA2官微回应:深感痛心_全球观天下
每日热议!兄妹四人同时查出肠道肿瘤:1/4肠癌患者受家族因素影响
天玑9300要绝杀:采用4+4全大核架构 性能狙击A17功耗大降
京西产业引导基金签约发布 规模10.1亿元|当前热门
注意防暑!多地高温已超40℃
诚意满满 微星发布7大类PC新品:美与性能兼备 世界速讯
续航128公里 雅迪联手保时捷推出电动摩托车:卖4.5万
世界动态:丰田带头抵触汽车全面电动化 多家日本公司站队支持:不环保、自欺欺人
一脚踏入软绵云朵:361° 游鲸飞标洞洞鞋103元3.69折抄底
热门:易基因:全基因组ChIP-seq分析揭示细菌转录因子PhoB的基因内结合位点|mBio
直播源码平台搭建技术分享之直播短信功能
文档在线预览(三)使用js前端实现word、excel、pdf、ppt 在线预览|世界报资讯
天天看点:用一杯星巴克的钱,训练自己私有化的ChatGPT
mysql设置字段的排序规则对大小写敏感_焦点精选
51分09秒跑5公里! 96岁老太打破年龄组世界纪录
上海一老人误将地铁扶手当售卖机:拿起手机扫码
全球热头条丨AMD定制处理器瞩目:华硕ROG Ally掌机内部结构首次公布
鲁大师久用流畅度测试排名出炉:OPPO Find X6 Pro第一 天天短讯
环球新消息丨飞机起飞前男子以照顾师傅为由滞留商务舱:称不需要对号入座
神舟十六发射成功!03 你还有七个学生没毕业:网友点赞导师到太空跑数据去了
新洁能:5月29日融券净卖出4.04万股,连续3日累计净卖出4.99万股
Java实现打包压缩文件或文件夹生成zip以实现多文件批量下载
大语言模型技术原理-环球视讯
MySQL之运算符大全|每日速讯
第八单元 数组与集合
(Java)记一次通过API递归分页“爬取”网页数据的开发经历
神舟十六号发射圆满成功:大红屏再次点亮 环球新资讯
全脂/低脂可选:特仑苏纯牛奶2.7元/盒大促(商超6元)
中科院院士:电动车主可以往外卖电 一年能卖4000元-焦点简讯
世界短讯!“十项全能”是怎样一种体验?华为Mate X3绝对是大屏折叠旗舰天花板
世界视点!小米MIX Fold 3曝光:屏下摄像头+潜望长焦 再无短板
每日热讯!电力板块异动拉升 世茂能源两连板
企业内训一体化解决方案,布道师教学实训云平台【开源版上线】|今日热闻
世界快报:JS中的事件监听
最野性的福特SUV!探险者昆仑巅峰版上市:售39.98万
新资讯:媒体评“剩菜盲盒”被疯抢 越来越多年轻人喜爱:便宜、杜绝浪费食品
荣耀赵明:MagicOS 8.0会有巨大进步 某些层面跟鸿蒙流畅性不相上下-环球快资讯
天天实时:给老外来点中国车 比亚迪ATTO 3成海外多国销冠:跻进全球前10
每日简讯:PS5国内白菜价:但PS5游戏盘开始涨价了
MongoDB学习笔记:配置文件-世界今热点
天涯神贴合集(2023最新)
天天快资讯丨找数字专注力训练(找数字)
每日头条!刚被微软夸史上最可靠系统 Win11又惹祸:AMD显卡中招
天天讯息:知名电竞解说Yammers自杀 留遗书称曾遭霸凌:玩家晒视频怀念 再见了宝贝
国产电商二手剪辑卖货 拿捏欧美老外
女子用餐被收700元服务费却无服务 官方回应1对1管家服务:网友感慨
如何强制删除电脑文件内容(如何强制删除电脑文件)
收益率持续下行 同业存单市场走牛
世界快资讯丨【读财报】19家民营银行财报透视:网商银行、华瑞银行、新网银行不良率居前三
无敌性价比、能灭Zen4全家桶 Intel 14核酷睿i5-13600KF到手1969元
SSD大牌被卷到!铠侠RC20史低价:1TB 299元/2TB 599元
【世界新要闻】神舟十六号即将发射!三位航天员亮相出征仪式:要出差半年
天天热讯:今年最强LCD手机!Redmi Note 12T Pro游戏实测:《王者》《原神》几乎满帧
全球观点:是否具有派遣资格是什么意思_是否具有派遣资格
读数据压缩入门笔记02_二进制和熵
计划2030年前实现中国人登月 马斯克:中国航天比多数人想象得要强大
女子骨折做手术后左腿变长2.3厘米:鉴定十级伤残 医院拒赔
产油大国起内讧:俄罗斯低价供应大量石油 沙特都顶不住了|独家焦点
5月29日基金净值:信诚量化阿尔法股票A最新净值1.4838,跌0.3% 全球通讯
找狗(关于找狗的基本详情介绍) 当前最新
有这么个神人:被毒蛇咬173次 长期注射蛇毒 活了101岁