关于m3u8格式视频多线程下载及合并的详解,在以前博客里记录过 最近突发奇想,准备搞点非正规电影网站的资源下载器,在进行第一个网站时,可能因为该网站通信质量差,导致我多线程卡死,阻塞了 研究了一下网上资料以及自己的代码,已经解决了,下面是思路 当线程卡死或者阻塞时,应首先考虑网络或者其他异常导致请求无法自动判定为超时,挂掉该线程,而是使线程一直处于卡死状态 当手动加上超时时间,就可以大概率解决该异常 从某种程度上来说,我们做请求时,都应该加上超时限制,不然代码卡在奇怪的地方,还要分析好久 任何一个ts文件下载失败了都会导致最终视频无法合成,所以理论上,失败就重新入队,目前暂时未发现无限入队重试的情况
def down(ts_queue, headers):
tt_name = threading.current_thread().getName()
while True:
if ts_queue.empty():
break
url = ts_queue.get()
filename = re.search('([a-zA-Z0-9-_]+.ts)', url).group(1).strip()
try:
requests.packages.urllib3.disable_warnings()
r = requests.get(url, stream=True, headers=headers, verify=False, timeout=5)
with open('cache/' + filename, 'wb') as fp:
for chunk in r.iter_content(5424):
if chunk:
fp.write(chunk)
logging.info('[url] %s [线程] %s [文件下载成功] %s',url, tt_name, filename)
except Exception as e:
ts_queue.put(url)
logging.info('[ERROR] %s [文件下载失败,入队重试] %s', e, filename)