使用java随手写成,有需要可以自行修改。

项目使用到了fastjson,可以自行替换成其他json解析工具。

写这个的原因是因为下载到的其他工具弄出来的视频标题过长(应该取entry.json中的subtitle,而不是download_subtitle)。

使用前需要在电脑下载ffmpeg,并添加到环境变量中。

在java中执行cmd命令请参考:这里

遍历文件请参考:这里

import com.alibaba.fastjson.JSONObject;
import java.io.*;
import java.nio.charset.Charset; public class MergeBilibliCache {
static String path = "D:\\b站离线备份\\850463803";
static String outputPath = "D:\\b站离线备份\\850463803\\output";
static String baseCommand="ffmpeg -i \"%s\" -i \"%s\" -vcodec copy -acodec copy \"%s\"";//注意路径要加上引号!不然遇到有空格的文件名或者路径教你做人
public static void main(String[] args) {
//要遍历的路径
File file = new File(path); //获取其file对象
File output=new File(outputPath);
if(!output.exists()){
output.mkdirs();
} try {
func(file);
} catch (IOException e) {
e.printStackTrace();
}
} public static void func(File file) throws IOException { File[] fs = file.listFiles();
for (File f : fs) {
if (f.isDirectory()) //若是目录,则递归打印该目录下的文件
{
System.out.println("当前位于" + f.getAbsolutePath());
converter(f.getAbsolutePath());
}
if (f.isFile()) //若是文件,直接打印
System.out.println("当前发现" + f);
}
} public static void converter(String path) throws IOException {
File file = new File(path + "\\entry.json");
// FileInputStream inputStream=new FileInputStream(file);
BufferedReader bufferedReader = new BufferedReader(new FileReader(file));
String builder = null;
builder = bufferedReader.readLine();
JSONObject jsonObject = JSONObject.parseObject(builder);
String name=jsonObject.getJSONObject("page_data").getString("part");
System.out.println(jsonObject.getJSONObject("page_data").get("part"));
String newCommand=String.format(baseCommand,path+"\\64\\video.m4s",path+"\\64\\audio.m4s",outputPath+"\\"+name+".mp4");
execCommand(newCommand); }
//利用文件来缓存,不然很容易导致阻塞
public static void execCommand(String command) {
BufferedReader br = null;
try {
File file = new File("daemonTmp");
File tmpFile = new File("daemonTmp\\temp.tmp");//新建一个用来存储结果的缓存文件
if (!file.exists()) {
file.mkdirs();
}
if (!tmpFile.exists()) {
tmpFile.createNewFile();
}
ProcessBuilder pb = new ProcessBuilder().command("cmd.exe", "/c", command).inheritIO();
pb.redirectErrorStream(true);//这里是把控制台中的红字变成了黑字,用通常的方法其实获取不到,控制台的结果是pb.start()方法内部输出的。
pb.redirectOutput(tmpFile);//把执行结果输出。
pb.start().waitFor();//等待语句执行完成,否则可能会读不到结果。
InputStream in = new FileInputStream(tmpFile);
br = new BufferedReader(new InputStreamReader(in, Charset.forName("GBK")));
String line = null;
while ((line = br.readLine()) != null) {
System.out.println(line);
}
br.close();
br = null;
tmpFile.delete();//卸磨杀驴。
System.out.println("执行完成");
} catch (Exception e) {
e.printStackTrace();
} finally {
if (br != null) {
try {
br.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
} }

随手用Java写的bilibili缓存视频转换器(合成分离的视频和音频)的更多相关文章

  1. java 手写 jvm高性能缓存

    java 手写 jvm高性能缓存,键值对存储,队列存储,存储超时设置 缓存接口 package com.ws.commons.cache; import java.util.function.Func ...

  2. 从零开始学 Java - Spring 集成 Memcached 缓存配置(二)

    Memcached 客户端选择 上一篇文章 从零开始学 Java - Spring 集成 Memcached 缓存配置(一)中我们讲到这篇要谈客户端的选择,在 Java 中一般常用的有三个: Memc ...

  3. JAVA之旅(三十五)——完结篇,终于把JAVA写完了,真感概呐!

    JAVA之旅(三十五)--完结篇,终于把JAVA写完了,真感概呐! 这篇博文只是用来水经验的,写这个系列是因为我自己的java本身也不是特别好,所以重温了一下,但是手比较痒于是就写出了这三十多篇博客了 ...

  4. Java 使用 Map 实现缓存工具

    以下代码参考于网上,做了小部分修改. 该代码实现了定时清除临时缓存的功能. 缓存管理类 package com.wbproject.util.cache; import java.time.Local ...

  5. java中使用Ehcache缓存数据

    知识点:在java项目中,使用ehcache缓存数据 参考博客:http://www.cnblogs.com/jingmoxukong/p/5975994.html ()概述 Ehcache是一个纯J ...

  6. java中的本地缓存

    java中的本地缓存,工作后陆续用到,一直想写,一直无从下手,最近又涉及到这方面的问题了,梳理了一下.自己构造单例.guava.ehcache基本上涵盖了目前的大多数行为了.   为什么要有本地缓存? ...

  7. 用 Java 写个塔防游戏「GitHub 热点速览 v.21.37」

    作者:HelloGitHub-小鱼干 本周 GitHub Trending 的主题词是:多语言.本周特推的 C 语言教程是大家都知道的阮一峰编写的,想必和他之前的技术文章类似,能起到科普作用.再来时 ...

  8. kafka集群搭建和使用Java写kafka生产者消费者

    1 kafka集群搭建 1.zookeeper集群  搭建在110, 111,112 2.kafka使用3个节点110, 111,112 修改配置文件config/server.properties ...

  9. Java写的斗地主游戏源码

    源码下载在最后 我们的前年的课设要求做一个斗地主程序,当时正在愁如何做界面,当时刚好在学习C#,于是就用C#完成了这个程序.一方面,当时我C#功底还很差(其实现在也不怎么样),很多地方用了“笨办法”, ...

随机推荐

  1. 虫师Selenium2+Python_6、Selenium IDE

    P155--创建测试用例 录制脚本 编辑脚本 定位辅助 P159--Selenium IDE 命令 在浏览器中打开URL,可以接受相对路径和绝对路径两种形式 open open(url)   单击链接 ...

  2. Zookeeper开源客户端Curator之创建会话

    前面Zookeeper的链接使用的都是其提供的原生代码,实际开发过程中非常底层的细节开发工作如连接重连,反复注册等耗费开发人员大量的工作精力并且重复工作.而开源客户端Curator的出现解决了该类问题 ...

  3. 关于Linux操作系统的命令行文件拷贝

    关于Linux操作系统的命令行文件拷贝 起因:服务器的加密狗秘钥过期导致无法使用服务,需要将服务器里面的秘钥文件发送给授权人员.本以为十分容易,打开服务器,图形界面点击发送即可.没想到服务器的界面是命 ...

  4. 彻底明白Linux硬链接和软链接

    [硬连接] 在Linux的文件系统中,保存在磁盘分区中的实际文件不管是什么类型系统都给它分配一个编号,称为索引节点号(Inode Index),这个索引节点用来标识这个文件,即这个索引节点就代表了这个 ...

  5. linux下使用fcrackzip来暴力破解zip压缩包

    我是在kali上安装的,用命令sudo apt-get install fcrackzip 现在做一个例子,首先生成一个带有密码的zip的包 zip -P hujhh test.zip test1.t ...

  6. SUSCTF2022 Misc-AUDIO&RA2

    前言:这次参加了susctf感受颇深,题目难度不是很大很大,但是很考验基础的技术熟练度,比如re这次就因为不会套脚本去解密,导致卡死在了第一道题,一道没做出来.所以只做了做misc和web. RA2 ...

  7. Winform实现客户端的自动更新

              话不多说,直接上干货.当然也希望各位前辈多多指导. 自动更新客户端的设计原理图 请花两分钟时间,仔细阅读下面这张图,明白客户端自动升级的原理.        自动更新的效果图 1. ...

  8. idea教程--Maven 骨架介绍

    简单的说,Archetype是Maven工程的模板工具包.一个Archetype定义了要做的相同类型事情的初始样式或模型.这个名称给我们提供来了一个一致的生成Maven工程的方式.Archetype会 ...

  9. AcWing 289. 环路运输

    传送门 思路: 一个环路上的问题,考虑拆环为链然后复制一倍接在后面.那么对于Ai与Aj,不妨设j<i,如果i-j>N/2则两者距离在新的链上就是i-j,而如果i-j<=N/2那么两者 ...

  10. (转载)虚拟化(3):os调度策略。

    转自:https://zhuanlan.zhihu.com/p/38046313 这一章主要是介绍几个简单的调度器策略.内容比较简单,就简单汇总下. 首先我们对现有的计算机环境有如下几个假设: 1.每 ...