m3u8下载合并图片文件(但实际上还是ts文件)

本文揭示了如何处理M3U8文件中被伪装成PNG的TS片段,通过hexdump分析发现多余字节的存在。作者分享了Python代码,展示了如何定位并删除这些字节以恢复原始TS文件。核心内容涉及HTTP请求、文件头解析和多线程下载.

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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()

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

winnower-sliff

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值