使用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. Java判断是否是回文字符串

    public static boolean isPalindrome(String str) { int start = 0, end = str.length() - 1; while (start ...

  2. 读写分离&分库分表学习笔记

    读写分离 何为读写分离? 见名思意,根据读写分离的名字,我们就可以知道:读写分离主要是为了将对数据库的读写操作分散到不同的数据库节点上. 这样的话,就能够小幅提升写性能,大幅提升读性能. 我简单画了一 ...

  3. 谁才是微服务赢家:Quarkus 与 Spring Boot

    在容器时代("Docker 时代")Java 仍然处于领先地位,但哪个更好?Spring Boot 还是 Quarkus? 谁会最先进的?Spring Boot 或 Quarkus ...

  4. TestNG基本使用

    TestNG简介 Testng是一套开源测试框架,是从Junit继承而来,testng意为test next generation 创建maven项目,添加依赖 <dependency> ...

  5. excel仪表盘制作,商业智能仪表盘的作用

    ​商业仪表盘被称为管理驾驶舱的重要组成部分,无论是管理决策者,还是企业业务流程中的普通员工,都可以利用它来展示分析的结果,让决策更加快速准确,更快地推动业务流程的进展,提高工作效率. 一个明确地了解自 ...

  6. golang监听rabbitmq消息队列任务断线自动重连接

    需求背景: goalng常驻内存任务脚本监听rbmq执行任务 任务脚本由supervisor来管理 当rabbitmq长时间断开连接会出现如下图 进程处于fatal状态 假如因为不可抗拒因素,rabb ...

  7. 给npm换源

    为什么要换源? npm 官方站点 http://www.npmjs.org/ 并没有被墙,但是下载第三方依赖包的速度让人着急啊! 幸运的是,国内有几个镜像站点可以供我们使用,本人在使用 http:// ...

  8. 一张图看懂IaaS, PaaS和SaaS的区别

    转至:https://blog.csdn.net/liujg79/article/details/84453736 编译:老夫子 原文:https://www.bmc.com/blogs/saas-v ...

  9. Linux命令(ping-telnet-netstat-curl-ps)

    转至:https://www.jianshu.com/p/577bbd15a6f8 1.ping命令 ping命令用来测试主机之间网络的连通性.执行ping指令会使用ICMP传输协议,发出要求回应的信 ...

  10. 进程&线程(二):Thread相关方法与属性

    学习自:python进程.线程.协程 - 张岩林 - 博客园 1.threading.Thread Thread方法 方法(使用方法为Thread.xxx) 说明 start() 激活线程 getNa ...