使用脚本下载.ts文件并合并
文章目录
- 👑1.什么是.ts文件/.m3u8文件
- 🐱💻2. 使用脚本下载多个.ts文件(未加密)
- 2.1 找到请求url地址
- 2.2 代码
👑1.什么是.ts文件/.m3u8文件
参考:
- 【技术科普】HLS视频流内m3u8文件和TS切片是什么关系?
- 视频文件M3U8和TS格式切片,讨论一下?
- Python通过m3u8文件下载合并ts视频的操作
大概可以得出以下不太准确的一个描述:
m3u8是苹果公司推出一种视频播放标准,是一种文件检索格式,将视频切割成一小段一小段的ts格式的视频文件,然后存在服务器中(现在为了减少I/o访问次数,一般存在服务器的内存中),通过m3u8解析出来路径,然后去请求,是现在比较流行的一种加载方式。目前,很多新闻视频网站都是采用这种模式去加载视频。
M3U8文件是指UTF-8编码格式的M3U文件。M3U文件是记录了一个索引纯文本文件,打开它时播放软件并不是播放它,而是根据它的索引找到对应的音视频文件的网络地址进行在线播放。原视频数据分割为很多个TS流,每个TS流的地址记录在m3u8文件列表中。
.ts文件是切片后的视频文件,.m3u8文件实质是一个播放列表(playlist)
以百度百科-基金这一词条中秒懂百科的视频为例,其.m3u8文件使用文本文件打开后,内容如下:
#EXTM3U #EXT-X-VERSION:3#EXT-X-STREAM-INF:BANDWIDTH=1720000,RESOLUTION=1280x720 16978848c8546fb7bfe6156e6da07016_1280x720_1720000.m3u8#EXT-X-STREAM-INF:BANDWIDTH=803000,RESOLUTION=852x480 16978848c8546fb7bfe6156e6da07016_852x480_803000.m3u8#EXT-X-STREAM-INF:BANDWIDTH=448000,RESOLUTION=568x320 16978848c8546fb7bfe6156e6da07016_568x320_448000.m3u8#EXT-X-ENDLIST结合网络资源面板的内容,不难得知,最上面那个.m3u8文件中记录的是三种分辨率的.m3u8文件名称,打开具体分辨率的.m3u8文件,可以看到,记录的就是.ts文件的播放顺序
🐱💻2. 使用脚本下载多个.ts文件(未加密)
依然是以百度百科基金词条中的秒懂百科视频为例:
- 参考CSDN文章:Python通过m3u8文件下载合并ts视频
- 参考CSDN文章:ts文件解密+python脚本m3u8下载
- 参考CSDN文章:m3u8文件下载及合并
2.1 找到请求url地址
加载视频时,一定先加载.m3u8文件,然后再根据这个文件去加载.ts文件,在Networks中点击对应的资源,就可以看到请求地址(request url)了,类似的,可以去找找.ts文件的。
除了.m3u8文件中记录的.ts文件的相对路径(一般都只有文件名),还需要找到其完整的请求地址,如下(同时,可以看到.m3u8和.ts文件的url前缀都是一样的):
2.2 代码
确定地址之后,就可以开始进行下载和合并,代码如下:
import requests import osclass GetTsVideo():def __init__(self,m3u8_name,base_url,saved_path,savedVideoName):self.m3u8_name=m3u8_nameself.base_url=base_urlself.saved_path=saved_pathself.savedVideoName=savedVideoNamedef getTsList(self):"""根据给出的m3u8文件和基础url地址,得到ts名称列表"""response = requests.get(self.base_url+"/"+self.m3u8_name, stream=True, verify=False)rslist=response.text.split('\n')self.tslist=[]for i in rslist:if i.endswith(".ts"):self.tslist.append(i)return self.tslistdef downloadTsFile(self):"""根据上面得到的ts名称列表,结合基础url获得ts文件真正的请求url,并保存到本地,每保存一个,就打印一下提示信息“保存完毕”"""for i in self.tslist:tsURL=self.base_url+"/"+itry:response = requests.get(tsURL, stream=True, verify=False)except Exception as e:print("异常请求:%s" % e.args)returntsSavedPath = self.saved_path + "/"+ iwith open(tsSavedPath, "wb+") as file:for chunk in response.iter_content(chunk_size=1024):if chunk:file.write(chunk) print(f"TS文件:{tsURL}下载完毕!!") def mergeTsFile(self):"""可以通过使用命令行命令(或者命令行调用ffmpeg)也可以直接将视频文件都粗暴写入到一个mp4文件中(不考虑文件格式等问题)"""savedFile=os.path.join(self.saved_path,self.savedVideoName)+".mp4"with open(savedFile, 'wb+') as f:for i in self.tslist:ts_video_path = os.path.join(self.saved_path, i)f.write(open(ts_video_path, 'rb').read())print(f"写入{i}文件结束")print("合并完成!!")调用也很简单,以百度百科基金的秒懂百科视频为例,在找到基础前缀url地址后
m3u8file="16978848c8546fb7bfe6156e6da07016_1280x720_1720000.m3u8" # 给出最直接包含ts文件名的m3u8文件的文件名 baseurl="https://baikevideo.cdn.bcebos.com/media/mda-Ofvt2U7ehu4iIlST" # 给出当前这个视频的m3u8和ts前缀rul savepath="C:/1.learning/spider/download" # 给出要保存ts文件的位置 savedVideoName="rs" # 给出要保存的合并后的mp4文件的名称obget=GetTsVideo(m3u8_name=m3u8file,base_url=baseurl,saved_path=savepath,savedVideoName=savedVideoName) tslist=obget.getTsList() obget.downloadTsFile() obget.mergeTsFile() """ 1. 从m3u8文件中获取ts文件列表 2. 结合基础url和ts文件列表下载ts文件到savepath文件夹中 3. 将savepath文件夹中的ts文件合并,写入savedVideoName文件中,同时还是保存在savepath文件夹中 """写个类,这样以后调用起来就很方便了,哈哈,😊😊😊
总结
以上是生活随笔为你收集整理的使用脚本下载.ts文件并合并的全部内容,希望文章能够帮你解决所遇到的问题。
- 上一篇: 学习笔记:12864液晶模块的详细使用
- 下一篇: ZigBee协议栈点播