开启辅助访问 切换到宽版

精易论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

用微信号发送消息登录论坛

新人指南 邀请好友注册 - 我关注人的新帖 教你赚取精币 - 每日签到


求职/招聘- 论坛接单- 开发者大厅

论坛版规 总版规 - 建议/投诉 - 应聘版主 - 精华帖总集 积分说明 - 禁言标准 - 有奖举报

查看: 2005|回复: 12
收起左侧

[技术专题] m3u8视频多线程与线程池超快下载

[复制链接]
发表于 2024-7-26 20:08:25 | 显示全部楼层 |阅读模式   陕西省安康市
本帖最后由 hxq2015 于 2024-7-26 20:19 编辑

下载器截图.jpg 今日发一个新改进的m3u8视频下载利器,用到多线程和线程池,测试下载一个5千多条数据的链接,不崩溃、不溢出,速度还超快。借用了论坛里的优易线程池开源模块和数组批量快速代换开源码,虽然费了精币,但确实解决了问题。感谢易友无私奉献。我用精易的线程池和鱼刺多线程池,都不同程度的闪退或者假死,可能是用的不到位,就优易运行无碍,也懒得再花时间去研究了,当回搬运拼凑工,结合自己对m3u8的解析,达到了自己想要的结果,目的是好理解、简便、实用。源代码可能还有很多需完善和精改的地方,希望朋友修正、指出。
  
窗口程序集名保 留  保 留备 注
窗口程序集_启动窗口   
变量名类 型数组备 注
临时目录文本型保存下载文件的目录**
已下载数整数型  
表项整数型  
线程池易版线程池  
线程数整数型  

子程序名返回值类型公开备 注
__启动窗口_创建完毕  

子程序名返回值类型公开备 注
__启动窗口_可否被关闭逻辑型 
如果真 (提示框 (“是否有内容未下载完,确定退出吗?”, 1, , , )#确认钮 )
结束 ()
返回 ()
子程序名返回值类型公开备 注
解析 分析出ts数组下载流
参数名类 型参考可空数组备 注
m3u8文本型
变量名类 型静态数组备 注
路径文本型保存文件本地路径
地址源文本型分析开始地址**
新地址文本型得到二次地址**
域名头文本型链接头部**
域名中文本型链接中部**
域名尾文本型链接尾部**
key正则正则表达式类匹配取引号中间key
本地key文本型下载到本地的key
key替换文本型替换key文件中的网址为本地
计数整数型记录次数的变量
key文件文本型解密文件
域名文本型流名前附加域名**
二次源文本型分析二次地址返回文本**
ts列表文本型0分析得到下载列表**
解析流名文本型分解出单条ts**
计次整数型循环变量**
待换数组文本型0m3u8本地组
原文本文本型 
用作替换数组文本型0m3u8本地组
写出文本文本型m3u8本地组
路径 = 子文本替换 (临时目录, “\”, “/”, , , )
m3u8 = 子文本替换 (m3u8, “\”, “/”, , , )
域名头 = 文本_取左边 (m3u8, 网页_取域名 (m3u8), , )网页_取域名 (m3u8)  
域名尾 = 网页_取网址文件名 (m3u8)  ' index.m3u8
域名中 = 文本_取出中间文本 (m3u8, 域名头, 域名尾, , )  
' =============================================================拆分初始地链接
地址源 = 到文本 (HTTP读文件 (删首尾空 (m3u8)))  ' 解析网源地址
如果真 (地址源 = “”)
信息框 (“m3u8地址失效,可将https换成http再试”, 0, , )
返回 ()
如果 (寻找文本 (地址源, 域名中, , ) ≠ -1)
新地址 = 域名头 + 域名中 + 文本_取右边 (地址源, 域名中)  
新地址 = m3u8

' ========================================================================得到二次链接
二次源 = 到文本 (HTTP读文件 (新地址))
如果 (寻找文本 (二次源, 域名头 + 域名中, , ) ≠ -1)
域名 = 域名头 + 域名中  
域名 = 取文本左边 (新地址, 倒找文本 (新地址, “/”, , ))  
处理事件 ()
' ==========================================================================得到下载流前缀域名
如果真 (寻找文本 (二次源, “key.key”, , ) > 0)
key正则.创建 (“”#引号“(.*?)”#引号“”, 二次源)
计次循环首 (key正则.取匹配数量 (), 计数)
key文件 = key正则.取子匹配文本 (计数, 1)
key替换 = 路径 + “/”到文本 (计数)“.key”
二次源 = 文本_替换 (二次源, , , , key文件, key替换, , , )
如果 (寻找文本 (key文件, 域名头, , ) ≠ -1)
本地key = key文件
本地key = 域名头 + key文件
写到文件 (临时目录 + “\”到文本 (计数)“.key”, HTTP读文件 (本地key))  ' 写出key解密文件
计次循环尾 ()

' ==============================================================================写出解密文件
ts列表 = 分割文本 (二次源, 字符 (10), )
处理事件 ()
超级列表框1.全部删除 ()
如果 (取数组成员数 (ts列表) ≠ 0)
计次循环首 (取数组成员数 (ts列表), 计次)
如果真 (取文本右边 (ts列表 [计次], 3)“.ts”)
解析流名 = ts列表 [计次]
加入成员 (待换数组, 解析流名)
加入成员 (用作替换数组, 路径 + “/”取文本右边 (解析流名, 取文本长度 (解析流名)倒找文本 (解析流名, “/”, , )))
如果 (寻找文本 (解析流名, “http”, , ) ≠ -1)
解析流名 = ts列表 [计次]
如果 (寻找文本 (解析流名, “/”, , ) ≠ -1)
解析流名 = 文本_取右边 (解析流名, “/”)
解析流名 = 域名 + 解析流名
解析流名 = 域名 + 解析流名


表项 = 超级列表框1.插入表项 (, , , , , )
超级列表框1.置标题 (表项, 0, 到文本 (表项 + 1))
超级列表框1.置标题 (表项, 1, 解析流名)
超级列表框1.保证显示 (表项)
' ts列表加载到超级列表框了,就不用写出到本地了

计次循环尾 ()
标签1.标题 = “解析完成”
标签1.标题 = “源可能失效”
二次源 = 文本_快速替换_EX (二次源, 待换数组, 用作替换数组, 1, 1, )
写到文件 (临时目录 + “\index.m3u8”, 到字节集 (二次源))  ' 得到本地m3u8
处理事件 ()
关闭所有文件 ()
子程序名返回值类型公开备 注
_按钮1_被单击  
临时目录 = 取运行目录 ()“\” + 编辑框2.内容
如果 (编辑框1.内容 ≠ “” 编辑框2.内容 ≠ “”)
如果 (文件是否存在 (取运行目录 ()“\” + 编辑框2.内容 + “.mp4”))
创建目录 (临时目录)
信息框 (“文件已存在或文件名重复,请重命名”, 0, , )
返回 ()

信息框 (“下载链接或保存名没有填,请检查”, 0, , )
返回 ()

' ============================================================创建保存目录
启动线程 (&解析链接, , 线程数)
子程序名返回值类型公开备 注
解析链接  
解析 (编辑框1.内容)
如果真 (标签1.标题 = “解析完成”)
线程_关闭句柄 (线程数)
启动线程 (&开始下载, , )

子程序名返回值类型公开备 注
开始下载  
线程池.创建 (超级列表框1.取表项数 (), 时钟1)
计次循环首 (超级列表框1.取表项数 (), 表项)
线程池.投递任务 (&下载, 表项)
程序_延时 (1)
计次循环尾 ()
子程序名返回值类型公开备 注
下载  
参数名类 型参考可空数组备 注
表项整数型
变量名类 型静态数组备 注
ts名称文本型 
ts名称 = 超级列表框1.取标题 (表项 - 1, 1)
写到文件 (临时目录 + “\”网页_取网址文件名 (ts名称), HTTP读文件 (ts名称))
超级列表框1.置标题 (表项 - 1, 2, “已下载”)
已下载数 = 已下载数 + 1
进度条1.位置 = 到整数 (已下载数 ÷ 超级列表框1.取表项数 () × 100)
标签2.标题 = 到文本 (进度条1.位置)“%”
如果真 (标签2.标题 = “100%”)
线程池.结束标志 ()
下载子程序 ()

子程序名返回值类型公开备 注
下载子程序  
标签1.标题 = “下载完成,正在转换”
如果 (文件是否存在 (取运行目录 ()“\ffmpeg11.exe”))
信息框 (“请将ffmpeg11.exe放在本程序目录中”, 0, , )
返回 ()
系统_取DOS执行结果 (取运行目录 ()“\ffmpeg11 -allowed_extensions ALL -i  ” + 临时目录 + “\index.m3u8 -c copy  ”取运行目录 ()“\” + 编辑框2.内容 + “.mp4”)
如果真 (文件是否存在 (取运行目录 ()“\” + 编辑框2.内容 + “.mp4”))
删除目录 (临时目录)
超级列表框1.全部删除 ()
标签1.标题 = “下载完成,源已删除”
标签2.标题 = “0%”
进度条1.位置 = 0
编辑框1.内容 = “”
编辑框2.内容 = “”
线程池.销毁 ()


子程序名返回值类型公开备 注
_时钟1_周期事件  
线程池.处理线程 ()
子程序名返回值类型公开备 注
_按钮_搜寻_被单击  
变量名类 型静态数组备 注
行内容文本型 
网源码文本型 
网源码 = 到文本 (HTTP读文件 (网页地址框.内容))
如果 (文本_寻找文本 (网源码, “.m3u8”, , ) = -1)
信息框 (“没找到指定文件,请换网址再次搜寻”, 0, , )
返回 ()
行内容 = 文本_取指定变量文本行 (网源码, 文本_取文本所在行_优化版 (网源码, “.m3u8”, , ))
编辑框1.内容 = “http”文本_倒取出中间文本 (行内容, “.m3u8”, “http”, , )“.m3u8”

子程序名返回值类型公开备 注
_按钮3_被单击  
编辑框1.内容 = 子文本替换 (编辑框1.内容, “\/”, “/”, , , )
编辑框1.内容 = 子文本替换 (编辑框1.内容, “\”, “/”, , , )
编辑框1.内容 = 子文本替换 (编辑框1.内容, “https”, “http”, , , )
子程序名返回值类型公开备 注
_按钮2_被单击  
变量名类 型静态数组备 注
清晰度文本型0
取清晰度整数型 
取清晰度 = 文本_取中间_批量 (到文本 (HTTP读文件 (编辑框1.内容)), “NAME=”#引号, #引号, 清晰度, )
如果 (文本_寻找文本 (到文本 (HTTP读文件 (编辑框1.内容)), “NAME=”, , ) > 1)
组合框2.加入项目 (“有数据”, )
计次循环首 (取数组成员数 (清晰度), 取清晰度)
组合框2.加入项目 (清晰度 [取清晰度], )
计次循环尾 ()
组合框2.现行选中项 = 0
组合框2.加入项目 (“无选择”, )
组合框2.现行选中项 = 0


i支持库列表   支持库注释   
internet互联网支持库
iext扩展界面支持库一
EThread多线程支持库
M3U8多线程下载器(兴全工作室2024) - 副本.e (1.01 MB, 下载次数: 58)

签到天数: 6 天

发表于 2024-8-30 06:51:37 | 显示全部楼层   湖北省武汉市
感谢分享

回复 支持 反对

使用道具 举报

结帖率:17% (1/6)

签到天数: 3 天

发表于 2024-8-27 11:14:35 高大上手机用户 | 显示全部楼层   浙江省台州市
hxq2015 发表于 2024-7-26 20:29
老规矩,主要思路是分析出链接中的二次地址,再读取数据,然后分组、替换、下载,最后调用ffmpeg(最小体积1 ...

不能自动合并
回复 支持 反对

使用道具 举报

结帖率:17% (1/6)

签到天数: 3 天

发表于 2024-8-27 11:13:26 高大上手机用户 | 显示全部楼层   浙江省台州市
不能自动合并视频
回复 支持 反对

使用道具 举报

签到天数: 2 天

发表于 2024-8-20 18:01:26 | 显示全部楼层   山东省滨州市

感谢分享,下载看看
回复 支持 反对

使用道具 举报

结帖率:100% (1/1)

签到天数: 8 天

发表于 2024-8-16 12:30:11 | 显示全部楼层   香港特别行政区*
这个解决了我的燃眉之急。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-8-10 21:10:24 | 显示全部楼层   陕西省安康市
hxq2015 发表于 2024-7-26 20:25
各位关注的易友,可以不用再看以前写的哪些类似下载器了,这款应比它们都简洁、易懂、好用,目前进行了不同 ...

补上个优易多线程池模块,我怕易友找不到 优易多线程池.rar (1.42 KB, 下载次数: 8)
回复 支持 反对

使用道具 举报

签到天数: 3 天

发表于 2024-8-5 22:39:11 | 显示全部楼层   江苏省常州市
来来来看看
回复 支持 反对

使用道具 举报

结帖率:0% (0/2)
发表于 2024-7-29 13:53:33 | 显示全部楼层   四川省成都市
666666666666666
回复 支持 反对

使用道具 举报

结帖率:100% (9/9)

签到天数: 6 天

发表于 2024-7-27 08:57:10 | 显示全部楼层   广东省广州市
感谢分享,下载看看。
回复 支持 反对

使用道具 举报

签到天数: 4 天

发表于 2024-7-27 08:25:07 | 显示全部楼层   安徽省蚌埠市
6666666666666666666666666666666666667
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 致发广告者

发布主题 收藏帖子 返回列表

sitemap| 易语言源码| 易语言教程| 易语言论坛| 易语言模块| 手机版| 广告投放| 精易论坛
拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论,本站内容均为会员发表,并不代表精易立场!
论坛帖子内容仅用于技术交流学习和研究的目的,严禁用于非法目的,否则造成一切后果自负!如帖子内容侵害到你的权益,请联系我们!
防范网络诈骗,远离网络犯罪 违法和不良信息举报电话0663-3422125,QQ: 793400750,邮箱:wp@125.la
Powered by Discuz! X3.4 揭阳市揭东区精易科技有限公司 ( 粤ICP备12094385号-1) 粤公网安备 44522102000125 增值电信业务经营许可证 粤B2-20192173

快速回复 返回顶部 返回列表