Virink's Blog logo

Virink's Blog

Let life be beautiful like summer flowers, and death like autume leaves.

 Bilibili安卓客户端缓存视频导出小记

0x01 我有一个想要搞事情的想法

介于xxx原因,想要把B站的视频导出来,于是乎就折腾了一番

0x02 她是咋缓存视频的

一波搜索,发现其视频存在/sdcard/Android/data/tv.danmaku.bili/download/文件夹

tv.danmaku.bili -> danmaku 奇奇怪怪的名称,弹码(幕)库?

然后又分两种类型的视频,分别存放于两种格式命名的文件夹

  • 普通视频 : (AV编号) xxxxxxxxx
  • 番剧视频 : (s_番号) s_xxxx

普通视频

进入某一个普通视频目录

/sdcard/Android/data/tv.danmaku.bili/download/xxxxxxxxx

然后是以片段序数命名的文件夹 1、2、3、…etc,也就是默认P1、P2那种的

再进入第一个片段目录

/sdcard/Android/data/tv.danmaku.bili/download/xxxxxxxxx/1

你会看到一个文件夹和两个文件

  • lua.flv.bili2api.X 视频目录(不同的视频X是不同的。。具体是啥我没研究)
  • danmaku.xml 弹幕文件
  • entry.json 关于视频的一些相关信息
    • avid
    • title
    • type_tag : ‘lua.flv.bili2api.X’
    • part 片段名称
    • etc,还有一些视频时长、封面啥的信息

再进入视频目录

/sdcard/Android/data/tv.danmaku.bili/download/xxxxxxxxx/1/lua.flv.bili2api.X

这里就是最终的视频目录了

B站的视频在客户端是以blv为后缀命名的FLV(Flash Video)文件, 具体信息 ffmpeg -i x.blv

再然后就是,视频时长比较长,就会分割成一段一段的,0.blv, 1.blv,…x.blv

除了视频文件,还有一类x.blv.4m.sum校验文件以及 index.json 索引信息文件

番剧视频

s_xxxx里面就是每一集视频的ep编号, 和普通视频的片段目录差不多,其他都一样

小结

普通视频

/sdcard/Android/data/tv.danmaku.bili/download/av编号/片段序号/lua.flv.bili2api.X/xx.blv

番剧视频

/sdcard/Android/data/tv.danmaku.bili/download/s_番号/ep编号/lua.flv.bili2api.X/xx.blv

视频信息

entry.json

0x03 怎么把视频弄出来

手工(NONONO)

我傻啊,手工

写代码

于是乎,New 了一个 Android 工程 XXXXX

  • get SdcardPath
  • exists SdcardPath + ‘/Android/data/tv.danmaku.bili’ ?
  • 遍历 download 目录 -> 遍历
  • 读取 entry.json 找到 lua.flv.bili2api.X -> 遍历 x.blv

Java比较难搞定,各种复杂的东西都弄的头晕

遍历的数据存放在HashMap

然后把标题put到adapter,以ListView展示出来

ListView设置监听,点击就导出~~

导出,导出,导出,但是有一个问题,被切片了的 x.blv 咋整、、一波导出???

研究了一下,觉得用ffmpeg合并一下比较好

然后Google到了 FFmepg-Android

ffmpeg 怎么把多个flv合并起来???

反正各种Google也只看到一个比较麻烦的方法

ffmpeg -i 0.blv -c copy -bsf:v h264_mp4toannexb -f mpegts 0.ts
ffmpeg -i 1.blv -c copy -bsf:v h264_mp4toannexb -f mpegts 1.ts
ffmpeg -i n.blv -c copy -bsf:v h264_mp4toannexb -f mpegts n.ts

ffmpeg -i "concat:0.ts|1.ts|ts" -c copy -bsf:a acc_adtstoasc -movflags +faststart output.mp4

打算就这样子玩的时候,居然发现 FFmepg-Android 一次只能执行一个任务,这就需要掌握android的子线程串行任务了。。。

然而我实在怼不动了。。。。。

毕竟是业余开发、Java这种高大上的东西玩不动。。

学Java救不了中国
PHP是世界上最好的语言

0x04 无奈

不玩了,玩不动了

BilibiliHelper

本文标题 : Bilibili安卓客户端缓存视频导出小记
文章作者 : Virink
发布时间 :  
最后更新 :  
本文链接 : https://www.virzz.com/2017/12/24/bilibili_android_cache_videos_export.html
转载声明 : 转载请保留原文链接及作者。
转载说明 : 本卡片有模板生成,本人转载来的文章请忽略~~