python 下载m3u8格式视频,直接用'ab'方式写进一个mp4文件播放顺序出问题!
就是不是按照原有的顺序来的,求解决
我的意思是不用软件合并怎么才能完成呢?
[Python] 纯文本查看 复制代码 import requests
import re
import threading
import queue
from decimal import Decimal
import os
url = 'https://iqiyi.cdn9-okzy.com/20200416/8987_cd3e4bfa/index.m3u8'
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36'}
data = {}
count = 0
q = queue.Queue()
ts_link_2 = []
'''先是下载一个"头部文件"'''
req = requests.get(url, headers=headers).text
# print(req)
ts_link_1 = re.findall(r'\n(.*?).ts',req) # 寻找 Transport Stream文件格式
# print(ts_link_1)
'''再下载一个整个ts列表信息"'''
if len(ts_link_1) == 0: # 判断是否不存在
arr = req.split('\n')
# print(arr)
for i in arr:
if "m3u8" in i:
url = url.replace('index.m3u8',i)
# print(url)
req = requests.get(url, headers=headers).text
ts_link_2 = re.findall(r'\n(.*?\.ts)', req)
for ts in ts_link_2:
q.put(ts)
# print(q.qsize()) # q.qsize 在接下来的作用就是一个动态的列表
# print(len(ts_link_2))
'''然后开始下载"'''
def download_ts(q):
if not os.path.exists("./qs"):
os.mkdir("./qs")
while 1: # 表示永远循环,除非循环内部有跳出语句
bai = Decimal(str(1 - q.qsize() / len(ts_link_2))).quantize(Decimal('0.00'))
# 用 1 - qsize(变量)来做百分比
# Decimal('0.00') 保留三位有效数字
print("\r 进度:" + str(bai * 100) + "%|100%", end="")
name = q.get() # 取出队列
# print(name)
newUrl = url.replace("index.m3u8", name)
# print('\r' + newUrl)
r = requests.get(newUrl, None, stream=True)
# print(r.status_code) # 返回状态码
if r.status_code == 200:
open('./qs/shipin.mp4', 'ab').write(r.content) # 二进制b写入
# print("\n"+newUrl + "————下载成功!")
else:
print("\n" + newUrl + "————下载失败!")
q.task_done()
if q.empty():
break
# 使用进程运算 速度明显改善
try:
for i in range(20): # 20个线程
th = threading.Thread(target=download_ts, args=(q,)) # 注意 args=(q,)
th.start()
except:
print("Error: 无法启动线程")
上述的代码我也是“剽窃”坛友的,emmmm.肯定作了自己的修改。还望见谅。 |