Java学习者论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

恭喜Java学习者论坛(https://www.javaxxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,购买链接:点击进入购买VIP会员
JAVA高级面试进阶视频教程Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程

Go语言视频零基础入门到精通

Java架构师3期(课件+源码)

Java开发全终端实战租房项目视频教程

SpringBoot2.X入门到高级使用教程

大数据培训第六期全套视频教程

深度学习(CNN RNN GAN)算法原理

Java亿级流量电商系统视频教程

互联网架构师视频教程

年薪50万Spark2.0从入门到精通

年薪50万!人工智能学习路线教程

年薪50万!大数据从入门到精通学习路线年薪50万!机器学习入门到精通视频教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程 MySQL入门到精通教程
查看: 2702|回复: 0

[默认分类] 从QQ浏览器缓存文件中提取出完整的视频

[复制链接]
  • TA的每日心情
    开心
    2021-12-13 21:45
  • 签到天数: 15 天

    [LV.4]偶尔看看III

    发表于 2018-5-28 13:31:21 | 显示全部楼层 |阅读模式

    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 :
    1. brew install android-platform-tools
    复制代码

    ubuntu :
    1. sudo add-apt-repository ppa:nilarimogard/webupd8
    2. sudo apt-get update
    3. sudo apt-get install android-tools-adb android-tools-fastboot
    复制代码

    安装成功后,在终端(windows打开终端按住windows+r,输入cmd)运行
    1. adb devices
    复制代码
    验证是否成功连接手机,(windows可能要安装驱动,整个360手机助手会自动安装的,linux下不需要安装驱动,毕竟是亲爹),运行如下命令拷贝缓存文件到当前路径
    1. [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文件,但如果要更方便,需要进行视频文件格式转换。
    1. [code]import sys, os
    2. import shutil
    3. from Crypto.Cipher import AES
    4. def parse_m3u8_file(m3u8_file):
    5.     with open(m3u8_file, "rb") as fp:
    6.         current_line = fp.readline().rstrip("\n")
    7.         while (current_line):
    8.             if current_line.startswith("#EXT-X-KEY"):
    9.                 comps = current_line.split(",")
    10.                 URI = comps[1][5:-1]
    11.                 IV = comps[2][5:].rstrip("\n")
    12.                 with open(URI, "rb") as urifp:
    13.                     KEY = urifp.readline().rstrip("\n")
    14.                 fp.readline()
    15.                 ts_file = fp.readline().rstrip("\n")
    16.                 yield (IV, KEY, ts_file)
    17.             current_line = fp.readline()
    18. def decrypt(ciphertext, key, iv):
    19.     cipher = AES.new(key, AES.MODE_CBC, iv)
    20.     plaintext = cipher.decrypt(ciphertext[AES.block_size:])
    21.     return plaintext.rstrip(b"\0")
    22. def decrypt_aes_128_ts_file(iv, key, ts_file):
    23.     print(iv, key, ts_file)
    24.     out = ts_file[:-2]+".tsd"
    25.     if os.path.exists(out):
    26.         return out
    27.     with open(ts_file, "rb") as fo:
    28.         ciphertext = fo.read()
    29.     dec = decrypt(ciphertext, key, iv.decode("hex"))
    30.     with open(out, "wb") as fo:
    31.         fo.write(dec)
    32.     return out
    33. if __name__ == "__main__":
    34.     if len(sys.argv) != 2:
    35.         print("Usage: python %s m3u8_file" % sys.argv[0])
    36.         sys.exit(1)
    37.     m3u8 = sys.argv[1]
    38.     if not os.path.exists(m3u8) or not m3u8.endswith(".m3u8"):
    39.         print("Input file should be a m3u8 file.")
    40.         sys.exit(1)
    41.     tsd_files = []
    42.     for (iv, key, ts_file) in parse_m3u8_file(m3u8):
    43.         tsd_files.append(decrypt_aes_128_ts_file(iv, key, ts_file))
    44.     with open(m3u8[:-4]+"ts", "wb") as merged:
    45.         for ts_file in tsd_files:
    46.             with open(ts_file, "rb") as mergefile:
    47.                 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的。

    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|Java学习者论坛 ( 声明:本站资料整理自互联网,用于Java学习者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2024-5-3 07:57 , Processed in 0.301935 second(s), 38 queries .

    Powered by Discuz! X3.4

    © 2001-2017 Comsenz Inc.

    快速回复 返回顶部 返回列表