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

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

1、chrome - F12的NetWork

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

6914313ecc29d114accee5df3c34e610.png

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

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

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

37ac406c6a6940105043613400066bd6.png

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

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

然后,我发现我太年轻了

3e71d62b68e29ebe34f7e75c6d186064.png

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

@echo 

48cc683a952dd24ae65d54d88f645414.png

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

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

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

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

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

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

222c5d1721b0c7cf8fc8576df9b7dd89.png

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

da2ef1f6cfd9dc2980e21d417710fcc4.png

a40f97396ceee96adc1caa19f3361b65.png

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

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

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......替换为本地路径

826a0c27d8f4785dccc5a625fa5a43dd.png

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

98a6e84b861b43be31cf31cad92112c4.png

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

2d25feb970edfa7ab106319d24661ca4.png

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

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

5、加密的ts文件

6fa5e287c5b7ebf25cf8f880e1b2609f.png

b8b0e11bf1ea88a7e92d1d69edc2625e.png

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

6e21bde8c392f0d4af2cd356feaaf7f3.png

将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可以很好的解决这些问题,有时间去研究一下,说不定会有一些收获。

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

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值