作为一个小白,很久以前就有过这样一种想法,就是写一个爬虫把自己喜欢的视频全爬下来,丢到服务器上,自己想看的时候就去里面找,可惜技术有限这么久也没有把自己的想法变为现实,研究了一段时间,写出来免得以后忘记了,以后技术积淀得多了,再完善。
1、chrome - F12的NetWork
发现视频文件都是一个个的ts文件
那就自然而然的产生了把这一个个ts文件都下载下来,然后合起来的想法
2、利用cmd的copy /b指令合并
我把ts文件都下载下来了,百度了合并的方法
ps:不选定文件,在空白处,按住Shift+鼠标右键打开cmd
输入:copy /b *.ts out.ts
然后,我发现我太年轻了
可以看见排序和我的想法产生了偏差,于是继续百度,发现了一段bat
@echo
到这里基本满足了我的需求,可也产生以下几个问题:
①如果视频太大,ts文件繁多,一个一个下载显然不现实
②如果ts的文件名不是按数字命名的,那么用这个批处理也合并不了。(非数字命名,可以直接用copy /b *.ts out.ts合并,可能不存在排序问题)
③只适用于ts文件可以播放,未加密的情况
3、python根据m3u8文件来下载合并
在百度合并视频文件的过程中,了解到m3u8文件,可以在浏览器F12的NetWork中拿到
因为,播放的视频文件是根据m3u8来拼接播放的,于是,想到用python将m3u8中的0.ts,1.ts,2.ts,3.ts......都拿出来,拼成链接,请求,写入文件,合并,就不用自己一个一个去下载了
代码辣眼睛,作者小白,理解一下。
在下载中,下载的文件大小可能与源文件大小产生偏差,用如下代码进行判断
response = requests.get(xjj_url, timeout=timeoutt)
filesize = response.headers["Content-Length"]
data = response.content
if not filesize == str(len(data)):
print("滚回去重新下载!")
将m3u8中的0.ts,1.ts,2.ts,3.ts......替换为本地路径
利用python调用FFmpeg来合并
from ffmpy3 import FFmpeg
with open(os.getcwd() + "index1.m3u8", "w") as f:
f.write(m3u8_file)
ff = FFmpeg(inputs={os.getcwd() + r'index1.m3u8': ''},
outputs={filename: '-c copy'})
print(ff.cmd)
ff.run()
到这里我解决了前面说的第①、②个问题,可是又产生了另一个问题:
④如果控制台中没有m3u8文件呢?我又该去哪里找链接呢?而且这种情况普遍存在
4、chrome扩展:猫抓
源码下载地址:https://github.com/xifangczy/cat-catch
偶然发现了猫抓扩展,但是,和我想要的还是有差别,于是我对它进行了修改
我Ctrl+C,Ctrl+V,对这些链接去重,校验,然后下载下来,合并,大功告成。
链接: https://pan.baidu.com/s/1WIQXZzNc-i5Ss1304WqSvA 提取码: ppmr
5、加密的ts文件
如果遇到这种情况,需要将key.key文件下载下来
将m3u8文件中的URI="key.key"修改为URI="C:/Users/Administrator/Desktop/key.key",注意斜杠的方向
with
6、未解决的问题
1)、虽然,猫抓可以拿到链接,但是,却需要等待视频缓存完毕,依然不是一个好的解决方案,问题④只解决了部分
如果,没有m3u8文件来合并ts,比如将ts列表放入txt里,用FFmpeg来合并,或者用copy /b来合并,合并后视频的连接处有卡顿的现象(copy /b比放入txt的ffmpeg合并效果更好)。这时需要自己生成一个m3u8文件来合并,可是,m3u8文件需要每一个ts视频的总时长(例:#EXTINF:14.4,)。比如下面的ts链接,我们可以通过end-start来得到这个ts的总时长,但是,并不是所有网站都是这样格式的链接
012_n0032mibckr.321004.1.ts?index=12&start=120000&end=132000&brs=31244848&bre=33063935&ver=4
3)、如果ts是使用SAMPLE-AES等方式加密的,FFmpeg并不支持解密,问题③只解决了部分