前言
就是一堆废话,可以不看,文末有代码,可以直接down
通过UC下载了一些视频,觉得过于精彩,应该保存下载,不过它是m3u8格式的,
之前为了给手机刷机,资料必须得备份,于是拷贝了出来,把手机上的资料清空了,现在想把视频合并,
手机端是有一些合并软件,但是pc端没找到啊!!
总不能再拷贝回去用手机合并吧,毕竟拷贝速度挺慢的,m3u8对应的文件夹下都是一些小的文件,动不动几千个小文件,
再说,拷回去用别人搞出来的东西岂不是很没面子!!!!
于是乎,自己动手丰衣足食(ps:其实是在网上找了半天,没找到一个能用的合并工具,还被网上那些无良广告坑了不少次,下的全都是绑定广告平台的下载软件,最终一怒之下决定自己搞一个!!)
正文
研究了下m3u8的结构,自己便动手了,起初以为简单的用IO流合并一下那些文件就可以了,没有看m3u8这个文件,结果合并之后,不能播放…
看了下m3u8,才知道有加密,用的是AES-128加密,m3u8文件中有对应的key
下面的是没有加密的.m3u8文件用文本编辑器打开后的内容,可以直接通过内容的文件顺序进行合并:
里面的EXTINF下面那一行文件路径就是每一个分段文件的路径地址,但我是拷贝到了电脑,明显路径发生了变化,而且我看没有加密,对于此类,没什么好处理,
直接把所有文件遍历一下,根据最后都是数字结尾的规律整理了一下,排个序,用IO流把所有文件合并了一下,然后就能播放了,
可关键是下面这种有加密的,下图是.m3u8文件的内容,视频文件夹中的local_index.m3u8:
图中圈红的就是加密,
EXT-X-KEY:METHOD=AES128,
#这个是加密方式
URI="/storage/emulated/0/UCDownloads/VideoData/1565274928110/k0"
#这个是key的位置
我下载的视频目前都是通过一个为k0的文件中的密钥和AES-128进行加密,这是UC浏览器自动为我们转换的一个m3u8文件,
我的m3u8视频文件夹中除了那些视频文件外还有以下三个文件:
这三个文件我打开inde.m3u8,这个文件中的描述如下:
local_index.m3u8的内容如下:
index.m3u8 里面的文件后缀为.ts,而加密文件的URI为 “key.key”,而local_index.m3u8正好描述的指向的是当前文件夹的文件和加密文件,这个应该是UC浏览器内部做的处理,我就不管了,我就按照这个local_index.m3u8 来进行操作;
文件夹中还有一个文件:
那个0-decrypted文件应该是示例的解密文件,这里就不管它了,
思路如下:
获取文件夹所有文件,对文件进行处理排序,文件夹中有一个k0文件,读取k0文件,获取密钥,每读取一个文件,解密,再进行合并。
以下是代码地址:
https://github.com/onlyyou112/mergeM3u8.git