有些网站的视频由几百上千个ts文件(即切片文件)组成,即使成功下载了这些ts文件,需要对它们按顺序地转码合并,输出为mp4等文件格式,才能正常播放。本文基于前人的基础上探索了一个相对方便和高效的方法,特此记录一下。简单来说,就是先利用python将这些ts文件下载到本地,然后用预先安装的ffmpeg包对ts文件进行合并输出为一个mp4文件,其中的难点在于在合并时如何解决密钥文件的问题。
以开课吧的某个视频为例:
https://learn.kaikeba.com/video/669486?is_auto_auth=1
打开网页,按下F12,并按下F5,输入关键字“m3u8”,可以获取该视频地址对应的m3u8文件和文件地址。在浏览器打开该地址,将m3u8文件下载到本地,可用文本编辑器打开。

方法一:用ffmpeg命令直接下载
打开cmd窗口,可以通过以下命令获取mp4文件:
ffmpeg -i https://v.baoshiyun.com/resource/media-863764093534208/lud/b5c45e654e5f48dca41be9c1644f9273.m3u8?MtsHlsUriToken=ca27617a79174646b13c65ab51da23693617756e26504f238ed0f715142333d7 video.mp4
上条命令的结构是这样的:ffmpeg -i 【m3u8文件的地址】 video.mp4
这种方法虽然比较简单,但是速度真的很慢,不适合用于下载比较大的视频文件。

方法二:下载多个切片ts文件到本地,再合并为一个mp4文件
可先用python自动下载这些数量较多的ts文件,然后在本地进行合并转码。
首先需要手动将上文提到的m3u8文件下载到本地,通过该文件可知ts文件的总数,以及每个ts文件名。m3u8文件前缀+ts文件名,即为每个ts文件的完整地址,有了这个地址就可以用python的wget包来自动循环下载所有的ts文件了。
import wget
path = r'C:\Users\Administrator\Desktop\视频\tsfiles'
for i in range(1, 823):
idx = str(i)
nz = 5 - len(idx)
idx = '0' * nz + idx
# print(idx)
url = 'https://v.baoshiyun.com/resource/media-863764093534208/lud/b5c45e654e5f48dca41be9c1644f9273-{}.ts'.format(idx)
wget.download(url, path + '\\' + '{}.ts'.format(idx))
将ts文件下载到本地后,下一步是修改m3u8文件。总共要修改2个地方,第一个是为每个ts文件加上本地完整路径,第二个是修改key。目的是指明合并的文件位置和所需的解码key。
原m3u8文件如下:

第一步,为每个ts文件加上本地完整路径(下载好的ts文件的所在位置):

第二步,修改key。
先在浏览器中打开原m3u8文件中关于key的URI地址,获得key值“993851207847a915”。


然后在本地新建一个记事本文件,将这个key值输入到文件中,更改文件名为key.key,保存。这时我们就有了包含实际key值的key格式本地文件。
继续修改m3u8文件,将key文件的URI地址更改为本地路径。

需要强调的是,本地路径的分隔符不是平常使用的“\”,而是“/”。
m3u8文件修改完毕,再进行最后一步啦。
利用ffmpeg将本地文件合并转码。
ffmpeg -allowed_extensions ALL -i index.m3u8 -c copy video.mp4
index.m3u8为本地的m3u8文件,video.mp4为输出的mp4文件。
Done~~
本文参考的链接如下:
本文介绍了如何利用Python和ffmpeg工具下载由多个ts切片组成的m3u8视频,并进行本地合并转码为mp4文件。首先,通过分析m3u8文件获取ts文件地址并使用wget下载;然后,修改m3u8文件以包含本地ts文件路径和解码key;最后,使用ffmpeg进行文件合并。这种方法适用于处理大型视频文件,解决了在线下载速度慢的问题。
148

被折叠的 条评论
为什么被折叠?



