import requests,re,datetime,multiprocessing,os,glob
#下载
def spider(url,savename):
#判断,如果ts文件存在,则返回,避免
if os.path.exists("ts//%s.ts"%savename):
return 0
#下载ts文件
response = requests.get(url,stream=True).content
with open("ts//%s.ts"%savename, 'wb')as fw:
fw.write(response)
print("%s over."%savename)
#检查
def check_num():
files_num = glob.glob(pathname='*.ts')
#判断文件数量,文件数量一致则开始执行合并
if int(ts_num) == int(files_num):
print("数量一样,开始执行合并....")
merge()
#不一致,则重新下载
elif int(ts_num) > int(files_num):
print("数量不一致,ts的总数量:%s 文件夹内的数量:%s"%(ts_num,files_num))
download()
else:
print("数量不一致,ts的总数量:%s 文件夹内的数量:%s"%(ts_num,files_num))
#合并
def merge():
#合并命令
cmd = r"D:\ffmpeg\bin\ffmpeg.exe -f concat -safe 0 -i C:\Users\work\Desktop\python\tttt\file.txt -c copy ./mp4/out3.mp4"
#执行合并
os.system(cmd)
print("合并完成....")
return 0
#调用下载
def download():
print("开始下载....")
#多进程下载ts文件
for i in ts_list:
zi_url = "https://XXXXXXXXX/20200905/XrwTMfaN/600kb/hls/" + i + ".ts"
pool.apply_async(spider,(zi_url,i))
pool.close()
pool.join()
print("下载完成....")
return 0
if __name__ == '__main__':
start = datetime.datetime.now().replace(microsecond=0)
#进程池40个
pool = multiprocessing.Pool(processes=40)
url = "https://XXXXXXXXX/20200905/XrwTMfaN/600kb/hls/index.m3u8"
response = requests.get(url,stream=True).text
#使用re模块获取到每个ts的名字
ts_list = re.findall("hls/(.*)\\.ts",response)
ts_num = len(ts_list)
#判断file.txt是否存在,存在则删除
if os.path.exists("./file.txt"):
os.remove("./file.txt")
#写入存放ts的路径到file.txt里,合成mp4的需要
for x in ts_list:
with open("./file.txt", 'a+',encoding='utf-8') as f:
f.write("file 'C:\\Users\\work\\Desktop\\python\\tttt\\ts\\%s.ts'\n"%x)
download()
check_num()
end = datetime.datetime.now().replace(microsecond=0)
print("用时: ", end='')
print(end-start)
####使用多进程下载ts文件,以及阻塞非阻塞的测试情况
#单线程 用时: 0:05:44
#进程池 5 非阻塞 用时: 0:02:03
#进程池 20 非阻塞 用时: 0:00:30
#进程池 5 阻塞 用时: 0:02:42
#进程池 20 阻塞 用时: 0:01:47