怎么在python中利用多线程下载m3u8格式视频
这篇文章将为大家详细讲解有关怎么在python中利用多线程下载m3u8格式视频,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。
importdatetime importos importre importthreading importrequests fromqueueimportQueue #预下载,获取m3u8文件,读出ts链接,并写入文档 defdown(): #m3u8链接 url='https://ali-video.acfun.cn/mediacloud/acfun/acfun_video/segment/3zf_GAW6nFMuDXrTLL89OZYOZ4mwxGoASH6UcZbsj1_6eAxUxtp3xm8wFmGMNOnZ.m3u8?auth_key=1573739375-474267152-0-a5aa2b6df4cb4168381bf8b04d88ddb1' #当ts文件链接不完整时,需拼凑 #大部分网站可使用该方法拼接,部分特殊网站需单独拼接 base_url=re.split(r"[a-zA-Z0-9-_\.]+\.m3u8",url)[0] #print(base_url) resp=requests.get(url) m3u8_text=resp.text #print(m3u8_text) #按行拆分m3u8文档 ts_queue=Queue(10000) lines=m3u8_text.split('\n') #找到文档中含有ts字段的行 concatfile='cache/'+"s"+'.txt' forlineinlines: if'.ts'inline: if'http'inline: #print("ts>>",line) ts_queue.put(line) else: line=base_url+line ts_queue.put(line) #print('ts>>',line) filename=re.search('([a-zA-Z0-9-]+.ts)',line).group(1).strip() #一定要先写文件,因为线程的下载是无序的,文件无法按照 #123456。。。去顺序排序,而文件中的命名也无法保证是按顺序的 #这会导致下载的ts文件无序,合并时,就会顺序错误,导致视频有问题。 open(concatfile,'a+').write("file%s\n"%filename) returnts_queue,concatfile #线程模式,执行线程下载 defrun(ts_queue): tt_name=threading.current_thread().getName() whilenotts_queue.empty(): url=ts_queue.get() r=requests.get(url,stream=True) filename=re.search('([a-zA-Z0-9-]+.ts)',url).group(1).strip() withopen('cache/'+filename,'wb')asfp: forchunkinr.iter_content(5242): ifchunk: fp.write(chunk) print(tt_name+""+filename+'下载成功') #视频合并方法,使用ffmpeg defmerge(concatfile,name): try: path='cache/'+name+'.mp4' command='ffmpeg-y-fconcat-i%s-crf18-ar48000-vcodeclibx264-c:aaac-r25-g25-keyint_min25-strict-2%s'%(concatfile,path) os.system(command) print('视频合并完成') except: print('合并失败') if__name__=='__main__': name=input('请输入视频名称:') start=datetime.datetime.now().replace(microsecond=0) s,concatfile=down() #print(s,concatfile) threads=[] foriinrange(15): t=threading.Thread(target=run,name='th-'+str(i),kwargs={'ts_queue':s}) threads.append(t) fortinthreads: t.start() fortinthreads: t.join() end=datetime.datetime.now().replace(microsecond=0) print('下载耗时:'+str(end-start)) merge(concatfile,name) over=datetime.datetime.now().replace(microsecond=0) print('合并耗时:'+str(over-end))
效果图:
代码开始:自己输入视频名称(也可以去原网站爬名称)
查看下载耗时,fmmpeg开始合并:
合并耗时:
关于怎么在python中利用多线程下载m3u8格式视频就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。
推荐阅读
-
Python中怎么动态声明变量赋值
这篇文章将为大家详细讲解有关Python中怎么动态声明变量赋值,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文...
-
python中变量的存储原理是什么
-
Python中怎么引用传递变量赋值
这篇文章将为大家详细讲解有关Python中怎么引用传递变量赋值,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文...
-
python中怎么获取程序执行文件路径
python中怎么获取程序执行文件路径,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的...
-
Python中如何获取文件系统的使用率
Python中如何获取文件系统的使用率,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴...
-
Python中怎么获取文件的创建和修改时间
这篇文章将为大家详细讲解有关Python中怎么获取文件的创建和修改时间,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读...
-
python中怎么获取依赖包
今天就跟大家聊聊有关python中怎么获取依赖包,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据...
-
python怎么实现批量文件加密功能
-
python中怎么实现threading线程同步
小编给大家分享一下python中怎么实现threading线程同步,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!...
-
python下thread模块创建线程的方法
本篇内容介绍了“python下thread模块创建线程的方法”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来...