文章目录

  • 一、需求
  • 二、现有办法
  • 三、困惑
  • 四、思路
  • 五、动手
  • 附:源代码

一、需求

  用手机从B站上缓存了一个列表的视频,但是它的音视频文件是分开的,而且只能用B站APP打开。想转成mp4格式在电脑上播放。

二、现有办法

  单个视频倒也好办,到该目录下cmd运行下面这行代码:

ffmpeg -i video.m4s -i audio.m4s -codec copy output.mp4

  马上就可以完事。

三、困惑

  但问题在于,一个列表的视频有二十多个,一个一个打开似乎太啰嗦,而且小破站放缓存文件的方式很阴间:


  点进一个视频的目录后,还要再进一个叫80的子目录才能看到源文件。点来点去实在麻烦,而且点开六七个后退出来找下一个,面对这一大堆以九位数字命名的目录,很可能找不到自己上一个是点了哪个文件夹。

四、思路

  于是我想,能不能用Java的File IO流来帮我们做点事。把这个过程自动化一下。
  我们已经知道如何手动处理单个音视频合并。如果我们用Java运行bat文件,bat文件的命令包括移动到指定目录和执行ffmpeg(上面那行代码),这不就是相当于上面手动运行cmd的效果了吗?

cd D:\Videos\545686540\c_341980251\80
ffmpeg -i video.m4s -i audio.m4s -codec copy output.mp4

  那么如何扩展到多文件呢?只要我们能得到其他源文件的路径,就能如法炮制,得到mp4文件。如果能把该路径自动化写出来,那这整个过程不就自动化了吗?
  我们观察到所有源文件的路径中只有c_341981036这一部分是不同的,那我们就重点解决它。
  正好Java File类提供给了我们一个方法file.list(),可以得到当前目录下的子文件和子文件夹,这正是我们需要的:

File file = new File(headPath);String[] list = file.list();

  然后遍历该数组,数组元素和两头两尾固定的路径拼接一下,就得到了一个完整的路径。至此核心问题已经解决。

五、动手

编写相关代码跑一个看看:

  这样做之后,已得到了所有视频的mp4文件,随便打开一个文件夹看一下:

  确实已经生成了mp4文件。不过生成的mp4文件分散在各个子目录里面,如果要去手动复制出来了话依然很繁琐。我们不妨在生成bat文件的时候就指定一个固定的输出目录:

"ffmpeg -i video.m4s -i audio.m4s -codec copy D:\\Videos\\createdMp4\\output" + i +".mp4"

  这样我们就得到了一打开就是mp4文件的文件夹。理想很美好,实际上我这么做,只得到两个mp4文件代码就不干活了,也不报错,就在那卡着,状态还是运行状态。不管他,就让它分散在自己的子目录里,我们换个办法,用IO流把文件复制一份到指定目录:

    public static void copy(int i) throws IOException {BufferedInputStream bis = new BufferedInputStream(new FileInputStream(mp4Path + "\\output.mp4"));BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("D:\\Videos\\createdMp4\\output" + i + ".mp4"));byte[] bytes = new byte[1024];int num = 0;while ((num = bis.read(bytes)) != -1){bos.write(bytes,0,num);}bos.close();bis.close();}


  至此,需求得到解决。

附:源代码

package com.serein.freedom;import java.io.*;/*** 需求:批量合并m4s音视频。每个视频的路径:d:\\a\\c_xxxxx(随机数)\\80\\video.m4s   d:\\a\\c_xxxxx(随机数)\\80\\audio.m4s* 思路:1.读取到某一条视频的信息*      2.运行命令行工具:ffmpeg -i video.m4s -i audio.m4s -codec copy output.mp4*      3.放到循环执行,遍历所有文件。(功能已经做完了)(做到这一步相当于是半自动洗衣机)*      4.优雅的把mp4文件取出来,放到一个文件夹中,最好文件名是有顺序的。(全自动洗衣机)*/
public class Test1 {static String batPath = "";static String mp4Path = "";static String headPath = "D:\\Videos\\545686540\\";public static void main(String[] args) throws Exception {//得到缓存列表视频直接父目录 下所有的子目录File file = new File(headPath);String[] list = file.list();for (int i = 0; i < list.length; i++) {batPath = headPath + list[i] + "\\80\\test.bat";mp4Path = headPath + list[i] + "\\80";
//            黑窗口最多同时打开15个
//            当视频不长“嗖”一下就搞定时没关系,当任务量大单个视频长的时候,用此方法可以当甩手掌柜,自己完全不用管事。if (i % 15 == 0){Thread.sleep(2000);}createBat();run_cmd("cmd /c" + batPath);copy(i);System.out.println("正在处理第 " + i + "个视频");}}/*** 复制文件集中到指定目录*/public static void copy(int i) throws IOException {BufferedInputStream bis = new BufferedInputStream(new FileInputStream(mp4Path + "\\output.mp4"));BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("D:\\Videos\\createdMp4\\output" + i + ".mp4"));byte[] bytes = new byte[1024];int num = 0;while ((num = bis.read(bytes)) != -1){bos.write(bytes,0,num);}bos.close();bis.close();}/*** 创建bat文件*/public static void createBat() throws IOException{//在当前目录创建bat文件BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter(batPath));//把命令写入bat文件bufferedWriter.write("cd " + mp4Path);bufferedWriter.newLine();bufferedWriter.write("ffmpeg -i video.m4s -i audio.m4s -codec copy output.mp4");bufferedWriter.newLine();//执行完后退出黑窗口bufferedWriter.write("exit");bufferedWriter.close();}/*** 运行bat文件* 感谢_Line_老哥,提供了Java打开批处理文件的办法。*/public static void run_cmd(String strcmd) throws IOException, InterruptedException {Runtime rt = Runtime.getRuntime();Process ps = null;//该对象的exec()方法指示Java虚拟机创建一个子进程执行指定的可执行程序// 并返回与该子进程对应的Process对象实例。ps = rt.exec(strcmd);//等待子进程完成再往下执行。ps.waitFor();//销毁子进程ps.destroy();}
}

使用Java和FFempeg批量转码B站缓存下来的列表视频,成MP4格式相关推荐

  1. 基于JAVA疫苗药品批量扫码识别追溯系统计算机毕业设计源码+系统+数据库+lw文档+部署

    基于JAVA疫苗药品批量扫码识别追溯系统计算机毕业设计源码+系统+数据库+lw文档+部署 基于JAVA疫苗药品批量扫码识别追溯系统计算机毕业设计源码+系统+数据库+lw文档+部署 本源码技术栈: 项目 ...

  2. 计算机毕业设计Java疫苗药品批量扫码识别追溯系统(系统+源码+mysql数据库+Lw文档)

    计算机毕业设计Java疫苗药品批量扫码识别追溯系统(系统+源码+mysql数据库+Lw文档) 计算机毕业设计Java疫苗药品批量扫码识别追溯系统(系统+源码+mysql数据库+Lw文档) 本源码技术栈 ...

  3. 【附源码】计算机毕业设计JAVA疫苗药品批量扫码识别追溯系统

    [附源码]计算机毕业设计JAVA疫苗药品批量扫码识别追溯系统 目运行 环境项配置: Jdk1.8 + Tomcat8.5 + Mysql + HBuilderX(Webstorm也行)+ Eclisp ...

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

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

  5. 视频AVI如何批量快速转换成MP4格式

    可能现在大部分人拍摄或是下载的视频都是MP4格式的,但其实视频的格式有非常多种.最近我们公司的小王就有个困扰,他的客户给了他一些AVI格式的视频,他却打不开了不知道怎么处理.其实AVI是将语音和影像同 ...

  6. java 视频统一转成mp4格式,并且异步多线程上传

    背景:遇到一个项目就是上传视频文件不限格式,需要全部统一转成mp4格式.具体细节是 1.前端展示的视频不能是从头加载的,需要像某讯那样快进到哪里,从哪个节点开始加载,实现无卡顿播放,2,后台获取时长, ...

  7. Python-opencv读取视频流处理后保存成mp4格式的视频源码

    源码 import cv2 def main():cap1 = cv2.VideoCapture("1.mp4") # 打开摄像头fourcc1 = cv2.VideoWriter ...

  8. m3u8手机批量转码_手机怎么把m3u8格式转换成mp4格式?

    展开全部 转换步骤如下: 一.手机上面找62616964757a686964616fe4b893e5b19e31333431373834到m3u8格式文件的存储位置,在打开方式里边选择"HT ...

  9. java 将avi视频转换为mp4格式并获取视频文件信息

    引入jar包 <!-- https://mvnrepository.com/artifact/ws.schild/jave-all-deps --><dependency>&l ...

最新文章

  1. 袁哥写的漏洞研究方法总结
  2. 北京内推 | 微软亚洲研究院MSRA STCA招聘多模态算法实习生
  3. nginx php7 fastcgi,Windows下搭建PHP7+FastCGI+Nginx环境
  4. Ubuntu 13.10配置root登录
  5. 论文计算机辅助辅助教学应用,计算机辅助教学应用论文.doc
  6. springBoot笔记(一) @SpringBootApplication的神奇魔力
  7. linux安全与优化
  8. 设置背景色为渐变色 css
  9. JAVA下载的详细教程
  10. Wincc RT Professional第一讲-组态
  11. 浅层神经网络和深层神经网络介绍
  12. 全国哀悼日 网站变灰装(附代码)
  13. HCIA-IoT 个人学习总结 Day3
  14. Logisim海明编码解码实验
  15. 一、barrier指令DSB,DMB,ISB,fence——内存屏障,指令屏障
  16. python如何横向输出_python数据竖着怎么变横的?
  17. 四元数与旋转——学习笔记(一)
  18. matlab cody学习笔记 day18
  19. 在android项目上集成libyuv库以及使用libyuv库完成camera的缩放,旋转,翻转,裁剪操作
  20. Java Web实用开发技术

热门文章

  1. 什么是安迪比尔定理?
  2. Spatial-Spectral Transformer for Hyperspectral Image Classification_外文翻译
  3. Android 9.0系统源码_SystemUI(二)StatusBar系统状态栏的创建流程
  4. ThreeJs中给立方体设置没有对角线的border
  5. 奇数位升序偶数位降序链表排序
  6. 华为正式发布鸿蒙艾,安卓12正式发布,华为掉出首发名单,鸿蒙系统硬扛谷歌苹果...
  7. S7-200与配备CU240BE-2的G120变频器进行USS通信的具体方法和步骤
  8. 面试官问了四个问题,总结了4个经验
  9. linux如何更改密钥环密码,Linux系统教程:Ubuntu桌面上禁用默认的密钥环解锁提示...
  10. python求解立方根_求解立方根