一个超简单的 m3u8 “混淆“
写在前面
由于最近一直在折腾我的 Nas,因此对视频的资源比较敏感。当前互联网已经与多年前天差地别,随着 BT 渐渐走向衰落,想要寻找一般的、无水印的视频更是难上加难。各种下载工具也层出不穷,奈何分享精神慢慢消失,工具在手找不到高清的资源又能怎么办呢?
只能剑走偏锋,从某些“特殊网站“获取资源,就拿这些网站来讲,视频 + 广告 = 流量 = 现金。因此他们会提供一些相对清晰的影视资源,但部分资源都是 M3U8,准确的说这不是视频格式,而是“视频片段索引“文件。
下载步骤
下载 M3U8 文件
某些文件下载时会校验访问者的 origin, referer, user-agent 甚至 cookies,所以这一步必须搞清楚网站需要什么,主打:需要什么提供什么。
下载 TS 片段
当你将 M3U8 下载后并打开,你会发现其中是一行行的 png 文件链接
当我们将 png 下载后,发现确实是一张张图片,及时强制将 png 后缀修改为 ts 也是徒劳的。我们可以简单看一下这个文件的 16 进制数据,如下
但当我们仔细看,会发现文件头部有 PNG 文件的特殊标记,并且在一定产地之后还会有 PNG 文件的结束标记,分别是 IHDR与 IEND,那么我们就有两个方法将 TS 文件还原,
方法一 破坏 PNG 文件头
将已下载的 PNG 文件头部8-16 个字节完全使用 0xFF 覆盖,让 ffmpeg 将此文件认为是一个 TS 的片段即可,这种方式简单但是不“优雅“,会引入很多不必要的脏数据。建议使用方法二
方法二 完全删除 PNG
其实可以定位IEND 的位置,其对应 16 进制就是 0x49454e44 只要定位出现的位置,删除包括它自己在内的所有数据,而后将剩下的文件重新以 ts 结尾命名,最后使用 ffmpeg 进行合并即可。
可能用到的一些命令片段
xxd -l [length] [file path] # 查看文件的16进制数据
ffmpeg -f concat -safe 0 -i list.txt -c copy output.mp4
-f concat:使用 concat demuxer
-safe 0:允许绝对路径
-c copy:不重新编码