欢迎访问 生活随笔!

生活随笔

当前位置: 首页 >

使用脚本下载.ts文件并合并

发布时间:2024/8/1 40 豆豆
生活随笔 收集整理的这篇文章主要介绍了 使用脚本下载.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文件并合并的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。