python dd 合并二进制文件_python根据m3u8合并ts视频文件

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

1、chrome - F12的NetWork

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

python dd 合并二进制文件_python根据m3u8合并ts视频文件_第1张图片

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

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

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

python dd 合并二进制文件_python根据m3u8合并ts视频文件_第2张图片

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

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

然后,我发现我太年轻了

python dd 合并二进制文件_python根据m3u8合并ts视频文件_第3张图片

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

@echo 

python dd 合并二进制文件_python根据m3u8合并ts视频文件_第4张图片

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

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

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

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

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

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

python dd 合并二进制文件_python根据m3u8合并ts视频文件_第5张图片

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

python dd 合并二进制文件_python根据m3u8合并ts视频文件_第6张图片

python dd 合并二进制文件_python根据m3u8合并ts视频文件_第7张图片

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

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

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 dd 合并二进制文件_python根据m3u8合并ts视频文件_第8张图片

利用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 dd 合并二进制文件_python根据m3u8合并ts视频文件_第9张图片

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

python dd 合并二进制文件_python根据m3u8合并ts视频文件_第10张图片

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

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

5、加密的ts文件

6fa5e287c5b7ebf25cf8f880e1b2609f.png

python dd 合并二进制文件_python根据m3u8合并ts视频文件_第11张图片

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

python dd 合并二进制文件_python根据m3u8合并ts视频文件_第12张图片

将m3u8文件中的URI="key.key"修改为URI="C:/Users/Administrator/Desktop/key.key",注意斜杠的方向

with 

6、未解决的问题

1)、虽然,猫抓可以拿到链接,但是,却需要等待视频缓存完毕,依然不是一个好的解决方案,问题④只解决了部分

2)、如果,没有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并不支持解密,问题③只解决了部分

------------------------------------------------------------------------------

第一次写这种玩意,写的不好,望见谅。当然you-get可以很好的解决这些问题,有时间去研究一下,说不定会有一些收获。

技术积累有限,希望可以抛砖引玉。

本文谨用于学习交流,如果涉及侵权,请@我删除。

你可能感兴趣的:(python,dd,合并二进制文件,和ts一般怎么玩)