作为一个小白,很久以前就有过这样一种想法,就是写一个爬虫把自己喜欢的视频全爬下来,丢到服务器上,自己想看的时候就去里面找,可惜技术有限这么久也没有把自己的想法变为现实,研究了一段时间,写出来免得以后忘记了,以后技术积淀得多了,再完善。

1、chrome - F12的NetWork

发现视频文件都是一个个的ts文件




python 把ts合并转mp4 python合成m3u8文件_python dd 合并二进制文件


那就自然而然的产生了把这一个个ts文件都下载下来,然后合起来的想法

2、利用cmd的copy /b指令合并

我把ts文件都下载下来了,百度了合并的方法


python 把ts合并转mp4 python合成m3u8文件_和ts一般怎么玩_02


ps:不选定文件,在空白处,按住Shift+鼠标右键打开cmd

输入:copy /b *.ts out.ts

然后,我发现我太年轻了


python 把ts合并转mp4 python合成m3u8文件_百度_03


可以看见排序和我的想法产生了偏差,于是继续百度,发现了一段bat


@echo


python 把ts合并转mp4 python合成m3u8文件_python dd 合并二进制文件_04


到这里基本满足了我的需求,可也产生以下几个问题:

①如果视频太大,ts文件繁多,一个一个下载显然不现实

②如果ts的文件名不是按数字命名的,那么用这个批处理也合并不了。(非数字命名,可以直接用copy /b *.ts out.ts合并,可能不存在排序问题)

③只适用于ts文件可以播放,未加密的情况

3、python根据m3u8文件来下载合并

在百度合并视频文件的过程中,了解到m3u8文件,可以在浏览器F12的NetWork中拿到


python 把ts合并转mp4 python合成m3u8文件_python_05


因为,播放的视频文件是根据m3u8来拼接播放的,于是,想到用python将m3u8中的0.ts,1.ts,2.ts,3.ts......都拿出来,拼成链接,请求,写入文件,合并,就不用自己一个一个去下载了


python 把ts合并转mp4 python合成m3u8文件_python_06


python 把ts合并转mp4 python合成m3u8文件_python dd 合并二进制文件_07


代码辣眼睛,作者小白,理解一下。

在下载中,下载的文件大小可能与源文件大小产生偏差,用如下代码进行判断


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 把ts合并转mp4 python合成m3u8文件_百度_08


利用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

python 把ts合并转mp4 python合成m3u8文件_和ts一般怎么玩_09


偶然发现了猫抓扩展,但是,和我想要的还是有差别,于是我对它进行了修改


python 把ts合并转mp4 python合成m3u8文件_python_10


我Ctrl+C,Ctrl+V,对这些链接去重,校验,然后下载下来,合并,大功告成。

链接: https://pan.baidu.com/s/1WIQXZzNc-i5Ss1304WqSvA 提取码: ppmr

5、加密的ts文件


python 把ts合并转mp4 python合成m3u8文件_python 把ts合并转mp4_11


python 把ts合并转mp4 python合成m3u8文件_百度_12


如果遇到这种情况,需要将key.key文件下载下来


python 把ts合并转mp4 python合成m3u8文件_python_13


将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并不支持解密,问题③只解决了部分