m3u8合并图片类型
如图可见,当要下载某个视频文件时发现是m3u8类型的。已知其会将视频划分为ts类型文件,具体原因不在此赘述。
但是发现我们获取到的是png图片类型文件,怎么回事呢?
使用hexdump可以发现其前缀是png类型
作为对比,可以看一下正常的ts类型文件头(感谢该博文的帮助)
可以发现我们的文件在正常的ts文件头前有0x46(70)个多余字节。根据推断,开头多余的字节数在不同网站上的规则不同,可能是用于规避云盘审查或其他原因。直接将其删除即可。
二编:我不服啊!csdn凭什么因为我代码过多就说不给我展示啊,我只是正常放代码而已啊喂!
附上的代码使用的是python字符串切分,比较简单,但需要指定删除的字节数(十进制)由于我下载的分片都是将ts伪装成png格式的,而其前缀固定大小为70个字节,所以我这里就指定为从70开始写入。暂时还未遇到在尾部添加信息的情况,不过Python就是这点好,可以从后方进行分割,但是遇到大文本时速度就会使其“受到挑战”。
import glob
import re, os
import threading
import requests
from tqdm import tqdm
# from you_get import common as you_get
headers = {
"User-Agent":
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.77 Safari/537.36 Edg/91.0.864.37"
}
sem=threading.Semaphore(10)
def downloadPng():
regex=re.compile("http:*")
with open('m3u8文件路径') as f:
for line in f:
if regex.search(line):
# url=(line)
# demo = requests.get(url, headers=headers) # 获取网站信息
with open("提取ts地址用以统一下载", 'a') as f:
f.write(line)
print(line)
def getPng(url, headers,name):
demo = requests.get(url, headers=headers) # 获取网站信息
# data = demo.json() # 转换为JSON格式
# print(demo.status_code)
# if(demo.status_code==200):
# filename=file_check("video.mp4")
with open(f"D:\VSCodeProject\Python\m3u8_test\pngs\\{name}.ts" , 'wb') as f: # 在指定文件夹下载ts文件,没有就创建
f.write(demo.content[70:])# 删除指定字节数,从之后开始写入
sem.release()
def download():
with open("D:\VSCodeProject\Python\m3u8_test\pngName.txt",'r') as f:
flines=f.readlines()
i=0
for line in tqdm(flines):
sem.acquire()
threading.Thread(target=getPng,args=(line,headers,i)).start()
i+=1
break
# getPng(line, headers)
def join():
# 切换到文件目录
os.chdir("D:\VSCodeProject\Python\m3u8_test\pngs")
ts_list = glob.glob('*.ts')
# ts_list 排序
ts_list = sorted(ts_list, key=lambda i: int(re.search('(\d+).ts', i).group(1)))
# 合并命令
merge_ts_list = "+".join(ts_list)
merge_command = f'copy /b {merge_ts_list} output.mp4'
# 执行合并命令
os.system(merge_command)
# downloadPng()
download()
# download_join()
# join()