【C# | Unity】B站Android客户端缓存视频提取工具

这篇文章使用了笨方法,后来在网上看到了 you-get 这款工具,可以在命令行通过URL直接下载视频,而且支持批量下载。

B站只允许使用手机缓存视频,但是缓存下来的视频分散在不同的文件夹里,而且每个视频的名称都是 0.blv ,不点开看的话根本不知道是哪个视频,所以写了一个辅助提取B站Android客户端缓存视频的小工具。
因为恰好开着Unity,所以就直接在Unity里面写了下面的这段代码,因而用了一些Unity的专用类,如果要在其他地方使用下面的代码,需要把文中提到的几个特殊类替换掉。

使用方法

这个工具是用来处理视频量比较大的视频合集的,如果是单个视频,直接手动复制视频然后重命名就好了。
用法很简单,在手机上把视频缓存好以后,手机连接电脑,打开视频的缓存文件夹,把缓存合集拖到复制到电脑上,然后再Unity的 Inspector 面板上填写视频位置信息,点击 Extract 即可完成提取。如果不想在Unity中使用,那么需要把下面提到的几个特殊类替换掉,然后调用 ExtractVideoFile() 方法提取视频。

注意:代码里处理视频用的是剪切方法,如果不把缓存的视频从手机里复制出来就直接运行代码,会把缓存的视频剪切到其他位置。如果不想剪切,可以把代码中的 File.Move() 方法改成 File.Copy() 方法。

参数示例

备注:有些视频集里面的单集视频会被分成多个视频文件(例如:0.blv,1.blv,2.blv等),这里没写处理方法。如果遇到这种情况,可以进行多次提取,每次提取时修改一下 源文件名称参数VideoName输出文件扩展名参数OutputExt (例如: VideoName:"1.blv"OutputExt:"-1.flv" )。多次提取时,已经提取过的文件会报 找不到视频文件 的错误,可以忽略。

B站Android客户端的一些相关信息

  • 缓存视频的存放文件夹是 手机内部存储\Android\data\tv.danmaku.bili\download\
  • 具体的视频路径是 手机内部存储\Android\data\tv.danmaku.bili\download\<avid>\<index>\<lua.xxx.xxx.xxx>\<x.blv>
  • 存储每个视频的信息的文件是 手机内部存储\Android\data\tv.danmaku.bili\download\<avid>\<index>\entry.json
  • 上述说明中的 avidindexlua.xxx.xxx.xxxx.blv 需要根据下载的文件的具体名称进行修改,代码中的 domain 参数就是 lua.xxx.xxx.xxx 部分。

用到的特殊类及其方法

  • MonoBehaviour:Unity独有的类,仅起到方便调用的作用,没别的用处。
  • Debug.Log():Unity独有的日志输出方法,在控制台中可以使用Console.WriteLite()替代。
  • JsonUtility.FromJson():Unity独有的Json解析方法,可以使用其他第三方Json解析工具替代。

源代码

using System.IO;
using UnityEngine;public class BilibiliTool : MonoBehaviour
{/** 说明* B站Android客户端缓存视频的存放文件夹是“手机内部存储\Android\data\tv.danmaku.bili\download\”;* 具体的视频路径是“手机内部存储\Android\data\tv.danmaku.bili\download\<avid>\<index>\<lua.xxx.xxx.xxx>\<x.blv>”;* 存储每个视频的信息的文件是“手机内部存储\Android\data\tv.danmaku.bili\download\<avid>\<index>\entry.json”;* 上述说明中的<avid>、<index>、<lua.xxx.xxx.xxx>、<x.blv>需要根据下载的文件的具体名称进行修改,代码中的“domain”参数就是“lua.xxx.xxx.xxx”部分。*/// 默认值仅作示例,每个视频集的avid和视频父文件夹名称都不一样,要进行相应的修改public string inputFolder = @"E:\资料\视频教程\46312220\";public string outputFolder = @"E:\资料\视频教程\线性代数\";public string domain = "lua.flv720.bili2api.64";public int startNumber = 1;public int endNumber = 116;public string videoName = "0.blv";public string outputExt = ".flv";public string jsonName = "entry.json";[Header("点击勾选框执行提取")]public bool extract = false;private void OnValidate(){if (extract){extract = false;ExtractVideoFile(inputFolder, outputFolder, domain, startNumber, endNumber, videoName, outputExt, jsonName);}}/// <summary>/// 提取视频文件。/// </summary>/// <param name="inputFolder">存放下载的原始视频的文件夹</param>/// <param name="outputFolder">提取视频的输出文件夹</param>/// <param name="domain">原始视频文件路径中格式为“lua.x.x.x”的文件夹的名称</param>/// <param name="startNumber">视频合集中视频的起始编号</param>/// <param name="endNumber">视频合集中视频的结束编号</param>/// <param name="videoName">原始视频名称(默认为0.blv)</param>/// <param name="outputExt">输出视频文件的扩展名(默认为flv)</param>/// <param name="jsonName">存储视频信息的Json文件的名称(默认为entry.json)</param>public void ExtractVideoFile(string inputFolder, string outputFolder, string domain, int startNumber, int endNumber, string videoName = "0.blv", string outputExt = ".flv", string jsonName = "entry.json"){// 检查输入路径if (!Directory.Exists(inputFolder)){Debug.LogError("文件路径<" + inputFolder + ">不存在。", this);return;}// 检查输出路径if (!Directory.Exists(outputFolder)){Directory.CreateDirectory(outputFolder);}// 移动和重命名for (int i = startNumber; i < endNumber + 1; i++){// 将原始视频移动到指定位置string sourceFilePath = string.Format(@"{0}\{1}\{2}\{3}", inputFolder, i, domain, videoName);if (!File.Exists(sourceFilePath)){Debug.LogError("找不到视频文件<" + sourceFilePath + ">。", this);continue;}// 可能读不到文件或者格式无法正常解析string jsonPath = string.Format(@"{0}\{1}\{2}", inputFolder, i, jsonName);try{string json = File.ReadAllText(jsonPath);Bilibili bili = JsonUtility.FromJson<Bilibili>(json);// 重命名视频string name = bili.page_data.part;string outputFilePath = string.Format(@"{0}\{1}{2}", outputFolder, name, outputExt);File.Move(sourceFilePath, outputFilePath);}catch{Debug.LogError("无法解析文件<" + jsonPath + ">。", this);continue;}}Debug.Log("视频提取完成。", this);}
}/// <summary>
/// 手机内部存储\Android\data\tv.danmaku.bili\download\avid\index\entry.json的格式。
/// </summary>
[System.Serializable]
public class Bilibili
{public bool is_completed;public int total_bytes;public int downloaded_bytes;public string title;public string type_tag;public string cover;public int prefered_video_quality;public int guessed_total_bytes;public int total_time_milli;public int danmaku_count;public int time_update_stamp;public int time_create_stamp;public int avid;public int spid;public int seasion_id;public PageData page_data;[System.Serializable]public class PageData{public int cid;public int page;public string from;public string part;public string vid;public bool has_alias;public string weblink;public int tid;}
}

【C# | Unity】B站Android客户端缓存视频提取工具相关推荐

  1. B站手机APP缓存视频(m4s)转换为mp4格式

    B站手机APP缓存视频转换到电脑上面播放 前言 效果 缓存视频 上传到PC端 找到缓存的视频存放位置 连接手机上传数据到PC端 通过批处理命令进行转换 前言 哔哩哔哩为我们提供了许多的资源,比如某某课 ...

  2. Node.js脚本项目合集(一):Node.js+FFmpeg实现批量从B站导出离线缓存视频到mp4格式,mp4转mp3,实现听歌自由

    Node.js脚本项目合集(一):Node.js+FFmpeg实现批量从B站导出离线缓存视频到mp4格式,mp4转mp3,实现听歌自由 前言 一.准备工作以及介绍 1.什么是FFmpeg 2.FFmp ...

  3. 全网功能最全的无水印短视频提取工具

    介绍: 视频下载简介:全网功能最全的无水印短视频提取工具,只要输入短视频链接,即可一键下载超多的无水印视频哦,欢迎下载体验! 网盘下载地址: https://zijiewangpan.com/8SJk ...

  4. m3u8 视频提取工具(下载web中的ts文件)

    m3u8 视频提取工具(下载web中的ts文件) 开发背景 m3u8视频格式简介(借用他人描述) m3u8视频格式原理:将完整的视频拆分成多个 .ts 视频碎片,.m3u8 文件详细记录每个视频片段的 ...

  5. Android客户端缓存机制(文字缓存和多媒体文件缓存)

    概述: 客户端缓存机制是Android应用开发中非常重要的一项工作,使用缓存机制不仅仅可以为用户节省3G流量,同时在用户体验方面也是非常好的选择. 缓存机制分为两部分,一部分是文字缓存,另一部分是多媒 ...

  6. B站UWP客户端下载视频整理脚本

    我的B站UWP版版本: B站UWP版客户端可以将视频下载到本地,但是视频前面加了\xFF\xFF\xFF前缀 并且文件目录及名称比较混乱. 对于分P较多的视频整理起来比较麻烦. 这里提供一个整理格式的 ...

  7. 简单移动Android客户端,下厨房移动第一站–android客户端

    下厨房网站期望可以帮助找到适合你的菜谱,现在,这个句子可以加上"随时随地",用android操作系统手机的朋友可以成为我们的第一批小白鼠.除了和网页版本一样可以查找浏览几万道菜谱做 ...

  8. Android客户端内置内存工具进行崩溃定位的实践经验

    前言 本宝宝苦啊,辛辛苦苦上线一个版本,上线之后,看到崩溃日志,感觉整个人都不好了. 别人家的崩溃日志是这样子的: 1 Fatal Exception: java.lang.NullPointerEx ...

  9. ev1百家云视频解密工具、ev1视频提取工具,支持Windows、MacOS、Linux

    介绍: 根据你的系统进入相对应的文件夹 打开 终端 键入:ev1_decode 后面空格隔开键入 ev1文件路径 回车.转换将在瞬间完成 网盘下载地址: http://www.bytepan.net/ ...

  10. python + ffmpeg 将某站的缓存视频文件批量转换为MP4格式

    这是一篇很无聊的文章,之所以写它是因为这周还没写博客,但是好像没啥可写的,刚好今天突发奇想,想要把某站的APP缓存视频文件转化为mp4 格式,方便在电脑上看,方法很简答,很快就做完了,所以,又一篇水文 ...

最新文章

  1. spring gateway 限流持久化_Spring Cloud Gateway 扩展支持动态限流
  2. C++ Builder 5编HOOK程序
  3. quarkus_使用Quarkus调试容器中的系统测试(视频)
  4. ios企业应用发布流程
  5. ajax加载对应的json,jQuery:多个AJAX/JSON请求对应单个回调并行加载
  6. 阿德莱德大学招聘博士后研究员
  7. 知识管理java_java面试题 - 集合框架
  8. oracle分页的三种方式,oracle 使用rownum的三种分页方式
  9. CSS 魔法系列:纯 CSS 绘制各种图形《系列六》
  10. C#中的Attributes的用法
  11. 从jensen不等式到相对熵的非负性性
  12. 淘宝的npaliedit在mb下会崩溃的问题解决了
  13. 什么是陀螺仪的dr算法_如何评价项目:通过陀螺仪传感器算法,从声波振动中提取语音?...
  14. dedecms二次开发总结 变量参数
  15. 怎么样关掉红米note开发者选项
  16. java中指数形式的格式_java – 复数的指数形式
  17. 中文知识图谱CN-DBpedia构建的关键技术
  18. java学习--类与对象
  19. csr867x入门之提示音配置(十二)
  20. Profinet通信协议基础知识

热门文章

  1. 【PDF合并】滴滴出行电子发票及行程报销单【一页打印】
  2. kvm虚拟机日常操作命令梳理
  3. 疑犯追踪第五季/全集Person of Interest迅雷下载
  4. 微观经济学案例分析(五)
  5. photoshop制作ico图标
  6. wpf 鼠标拖动绘制几何图形
  7. nyoj234 吃土豆
  8. 区块链项目需要服务器吗,区块链需要服务器吗
  9. 国际贸易基础(一)找客户
  10. 计算机百科丨存储介质发展史