python3 进程池下载m3u8视频,下载ts并且合并成mp4

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


 

你可能感兴趣的:(python,python)