TA的每日心情 | 开心 2021-12-13 21:45 |
---|
签到天数: 15 天 [LV.4]偶尔看看III
|
linux系统解决方案,mac应该也可以 https://github.com/lxhao/merge_video_cache
1、 本实验以安卓手机QQ浏览器为例,随便打开一个视频进行在线观看,点击缓存按钮缓存当前视频。
2、视频缓存完成后,缓存文件会保存在“/sdcard/QQBrowser/视频”下面,接下来我们把整个视频文件夹拷贝出来,进行格式转换。下图是我把缓存文件拷贝到电脑上后看到的内容,下载的视频为多个ts文件,保存在“.13b”这个目录下面,其中“.b7a”是另一个缓存视频的文件,“视频-2.m3u8”保存了缓存文件的路径和AES密钥,我们打开这个文件看一下,里面其实就是保存了ts文件的路径,AES其实是对应ts文件的密钥。那现在要考虑如何把文件从手机拷贝出来,这时候需要adb工具了,adb工具的安装,win系统http://blog.csdn.net/zhaodezhong/article/details/6726982,
mac :
- brew install android-platform-tools
复制代码
ubuntu :
-
- sudo add-apt-repository ppa:nilarimogard/webupd8
- sudo apt-get update
- sudo apt-get install android-tools-adb android-tools-fastboot
-
复制代码
安装成功后,在终端(windows打开终端按住windows+r,输入cmd)运行验证是否成功连接手机,(windows可能要安装驱动,整个360手机助手会自动安装的,linux下不需要安装驱动,毕竟是亲爹),运行如下命令拷贝缓存文件到当前路径
- [code]adb pull /sdcard/QQBrowser/视频/ .
复制代码 [/code]
视频-2.m3u8的内容:
3、现在我们拿到了缓存文件,只要把ts缓存文件解密并合并就是原来的视频文件了,但这个ts格式的视频文件对一般的播放器都不怎么友好,需要再进行一次格式转换。转换之前,我们还需要做一件事情,我们知道”视频-2.m3u8”里面保存了ts文件和秘钥的路径,但这个路径是相对于手机上的,现在文件拷贝到了电脑上,那么”视频-2.m3u8”里面的路径也要替换为电脑上面额路径,缓存文件和”视频-2.m3u8”在同一个目录下面,直接用文本编辑器打开文件用全局替换把“file:///storage/emulated/0/QQBrowser/视频/” 去掉就好了,替换以后是下图这样子。
4、最后对ts缓存文件进行合并,大神给了一份现成的python代码,直接贴上来吧。在终端进入到“视频”文件夹下面,把下面的代码拷贝到“t.py”文件中。这是python的代码,需要python的环境,windows安装python2.7 http://www.liaoxuefeng.com/wiki/001374738125095c955c1e6d8bb493182103fac9270762a000/001374738150500472fd5785c194ebea336061163a8a974000 linux和mac自带python2.x(好像吐槽windows,装个软件好烦),然后运行 python t.py 视频-2.m3u8 进行缓存文件合并。执行成功后会生成一个“视频-2.ts”的文件,这个文件就是完整的视频文件,有的播放器直接可以播放ts文件,但如果要更方便,需要进行视频文件格式转换。
- [code]import sys, os
- import shutil
- from Crypto.Cipher import AES
- def parse_m3u8_file(m3u8_file):
- with open(m3u8_file, "rb") as fp:
- current_line = fp.readline().rstrip("\n")
- while (current_line):
- if current_line.startswith("#EXT-X-KEY"):
- comps = current_line.split(",")
- URI = comps[1][5:-1]
- IV = comps[2][5:].rstrip("\n")
- with open(URI, "rb") as urifp:
- KEY = urifp.readline().rstrip("\n")
- fp.readline()
- ts_file = fp.readline().rstrip("\n")
- yield (IV, KEY, ts_file)
- current_line = fp.readline()
- def decrypt(ciphertext, key, iv):
- cipher = AES.new(key, AES.MODE_CBC, iv)
- plaintext = cipher.decrypt(ciphertext[AES.block_size:])
- return plaintext.rstrip(b"\0")
- def decrypt_aes_128_ts_file(iv, key, ts_file):
- print(iv, key, ts_file)
- out = ts_file[:-2]+".tsd"
- if os.path.exists(out):
- return out
- with open(ts_file, "rb") as fo:
- ciphertext = fo.read()
- dec = decrypt(ciphertext, key, iv.decode("hex"))
- with open(out, "wb") as fo:
- fo.write(dec)
- return out
- if __name__ == "__main__":
- if len(sys.argv) != 2:
- print("Usage: python %s m3u8_file" % sys.argv[0])
- sys.exit(1)
- m3u8 = sys.argv[1]
- if not os.path.exists(m3u8) or not m3u8.endswith(".m3u8"):
- print("Input file should be a m3u8 file.")
- sys.exit(1)
- tsd_files = []
- for (iv, key, ts_file) in parse_m3u8_file(m3u8):
- tsd_files.append(decrypt_aes_128_ts_file(iv, key, ts_file))
- with open(m3u8[:-4]+"ts", "wb") as merged:
- for ts_file in tsd_files:
- with open(ts_file, "rb") as mergefile:
- shutil.copyfileobj(mergefile, merged)
复制代码 [/code]
5、视频文件格式装换,这里有一个在线转换的网站 https://cloudconvert.com/ts-to-mp4 (这个省事,终于不要windows,linux,mac了)。在线转换要上传和下载文件非常耗时,线下可以用狸窝装换http://www.leawo.cn/space-627-do-thread-id-32121.html或者ts格式转换器http://www.leawo.cn/ND_upload.php?do=info&id=2558,这个貌似只有windows的。
|
|