怎么在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))

效果图:

怎么在python中利用多线程下载m3u8格式视频

代码开始:自己输入视频名称(也可以去原网站爬名称)

查看下载耗时,fmmpeg开始合并:

怎么在python中利用多线程下载m3u8格式视频

合并耗时:

怎么在python中利用多线程下载m3u8格式视频

关于怎么在python中利用多线程下载m3u8格式视频就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。

发布于 2021-03-24 01:21:50
收藏
分享
海报
0 条评论
187
上一篇:怎么在node环境中使用parse Smarty模板 下一篇:怎么在DataGridView中使用BindingNavigator实现一个分页功能
目录

    推荐阅读

    0 条评论

    本站已关闭游客评论,请登录或者注册后再评论吧~

    忘记密码?

    图形验证码