实现原理是,使用FFmpeg命令对音视频文件,按照需求进行重新编解码并存储。
注意:代码重点是方法formatConverter(File fileInput, File fileOutPut, boolean isVideo),方法任务是FFmpeg命令拼接,每一行都有注释帮助使用者理解并使用,按需求进行更改,然后命令执行方法不用过多关注!

第一步
复制下方工具类代码放入项目

public class FormatConverterUtils {/*** FFmpeg程序执行路径* 当前系统安装好ffmpeg程序并配置好相应的环境变量后,值为ffmpeg.exe可执行程序文件在实际系统中的绝对路径*/private static String FFMPEG_PATH;static {Properties props = new Properties();try (InputStream in = FormatConverterUtils.class.getClassLoader().getResourceAsStream("FFmpeg.properties");) {props.load(in);String osName = System.getProperties().getProperty("os.name");if (osName.startsWith("Windows")) {FFMPEG_PATH = props.getProperty("FFmpeg.exe.path");} else {FFMPEG_PATH = props.getProperty("FFmpeg.path");}} catch (Exception e) {log.error("静态配置文件内容读取失败!");}}/*** 音频转换器* @param resourcePath 需要被转换的音频文件全路径带文件名* @param targetPath 转换之后的音频文件全路径带文件名*/public static void audioConverter(String resourcePath, String targetPath) {formatConverter(new File(resourcePath), new File(targetPath), false);}/*** 视频转换器* @param resourcePath 需要被转换的视频文件全路径带文件名* @param targetPath 转换之后的视频文件全路径带文件名*/public static void videoConverter(String resourcePath, String targetPath) {formatConverter(new File(resourcePath), new File(targetPath), true);}/*** 文件格式转换器   * 注意!此方法为按照需求进行拼接命令来完成音频视频文件的处理 命令拼接需要根据自己需求进行更改* 视频 或 音频* @param fileInput 源文件路径* @param fileOutPut 转换后的文件路径* @param isVideo 源文件是视频文件**/public static void formatConverter(File fileInput, File fileOutPut, boolean isVideo) {if (null == fileInput || !fileInput.exists()) {throw new RuntimeException("源文件不存在,请检查源路径");}if (null == fileOutPut) {throw new RuntimeException("转换后的路径为空,请检查转换后的存放路径是否正确");}if (!fileOutPut.exists()) {try {fileOutPut.createNewFile();} catch (IOException e) {log.error("转换时新建输出文件失败");}}List<String> commond = new ArrayList<String>();//输出直接覆盖文件commond.add("-y");commond.add("-i");commond.add(fileInput.getAbsolutePath());if (isVideo) {//为视频流设置编码器commond.add("-c:v");//编码格式处理为H.264commond.add("libx264");//设置比特率commond.add("-b:v");//bit/scommond.add("1M");//设置分辨率commond.add("-s");commond.add("1280x720");//设置帧率commond.add("-r");//ftpscommond.add("25");}//设置音频编码器commond.add("-c:a");commond.add("aac");//音频采样率commond.add("-ar");//Hzcommond.add("44.1K");//音频比特率commond.add("-b:a");//bpscommond.add("96K");//音频声道commond.add("-ac");//stereo 立体声commond.add("2");commond.add(fileOutPut.getAbsolutePath());//执行命令executeCommand(commond);}/*** 执行FFmpeg命令* @param commonds 要执行的FFmpeg命令* @return FFmpeg程序在执行命令过程中产生的各信息,执行出错时返回null*/public static String executeCommand(List<String> commonds) {if (CollectionUtils.isEmpty(commonds)) {log.error("--- 指令执行失败,因为要执行的FFmpeg指令为空! ---");return null;}LinkedList<String> ffmpegCmds = new LinkedList<>(commonds);ffmpegCmds.addFirst(FFMPEG_PATH); // 设置ffmpeg程序所在路径log.info("--- 待执行的FFmpeg指令为:---" + ffmpegCmds);Runtime runtime = Runtime.getRuntime();Process ffmpeg = null;try {// 执行ffmpeg指令ProcessBuilder builder = new ProcessBuilder();builder.command(ffmpegCmds);ffmpeg = builder.start();log.info("--- 开始执行FFmpeg指令:--- 执行线程名:" + builder.toString());// 取出输出流和错误流的信息// 注意:必须要取出ffmpeg在执行命令过程中产生的输出信息,如果不取的话当输出流信息填满jvm存储输出留信息的缓冲区时,线程就回阻塞住PrintStream errorStream = new PrintStream(ffmpeg.getErrorStream());PrintStream inputStream = new PrintStream(ffmpeg.getInputStream());errorStream.start();inputStream.start();// 等待ffmpeg命令执行完ffmpeg.waitFor();// 获取执行结果字符串String result = errorStream.stringBuffer.append(inputStream.stringBuffer).toString();// 输出执行的命令信息String cmdStr = Arrays.toString(ffmpegCmds.toArray()).replace(",", "");String resultStr = StringUtils.isBlank(result) ? "【异常】" : "正常";log.info("--- 已执行的FFmepg命令: ---" + cmdStr + " 已执行完毕,执行结果: " + resultStr);return result;} catch (Exception e) {log.error("--- FFmpeg命令执行出错! --- 出错信息: " + e.getMessage());return null;} finally {if (null != ffmpeg) {ProcessKiller ffmpegKiller = new ProcessKiller(ffmpeg);// JVM退出时,先通过钩子关闭FFmepg进程runtime.addShutdownHook(ffmpegKiller);}}}/*** 用于取出ffmpeg线程执行过程中产生的各种输出和错误流的信息*/static class PrintStream extends Thread {InputStream inputStream = null;BufferedReader bufferedReader = null;StringBuffer stringBuffer = new StringBuffer();public PrintStream(InputStream inputStream) {this.inputStream = inputStream;}@Overridepublic void run() {try {if (null == inputStream) {log.error("--- 读取输出流出错!因为当前输出流为空!---");}bufferedReader = new BufferedReader(new InputStreamReader(inputStream));String line = null;while ((line = bufferedReader.readLine()) != null) {log.info(line);stringBuffer.append(line);}} catch (Exception e) {log.error("--- 读取输入流出错了!--- 错误信息:" + e.getMessage());} finally {try {if (null != bufferedReader) {bufferedReader.close();}if (null != inputStream) {inputStream.close();}} catch (IOException e) {log.error("--- 调用PrintStream读取输出流后,关闭流时出错!---");}}}}/*** 在程序退出前结束已有的FFmpeg进程*/private static class ProcessKiller extends Thread {private Process process;public ProcessKiller(Process process) {this.process = process;}@Overridepublic void run() {this.process.destroy();log.info("--- 已销毁FFmpeg进程 --- 进程名: " + process.toString());}}}

第二步
将下方配置文件下载放入项目resource文件下,具体配置内容修改,配置文件中有具体注释
配置文件链接:https://pan.baidu.com/s/15Lk4uU17oqBmz9MuQPbdnQ?pwd=jjjj
提取码:jjjj
第三步
下载下方文件(内含Linux和Windows的FFmpeg软件安装包(绿色免安装版,解压就能用)),按文件记录步骤进行解压,修改配置文件,就完事儿!
按照配置说明文件链接:https://pan.baidu.com/s/1yPZBSusCAIv2RFk7BCQgcQ?pwd=jjjj
提取码:jjjj
小助手:配置说明文件包含两个压缩包,鼠标右击包含的那个文件,选择“保存到文件”选项,如果还不行就下载WPS有此功能
愿君享用愉快!

Java FFmpeg的音视频处理相关推荐

  1. JAVA调用FFmpeg实现音视频转码加水印功能

    目录 目录 写在前面 MAVEN引用 获取音视频基本信息 音频转码成Mp3格式 视频转码成Mp4格式 视频转码成Mp4并添加文字水印 视频转码成Mp4并添加图片水印 测试代码 写在前面 如今各大云厂商 ...

  2. 【FFmpeg】使用 FFmpeg 处理音视频格式转换流程 ( 解复用 | 解码 | 帧处理 | 编码 | 复用 )

    FFmpeg 系列文章目录 [FFmpeg]Windows 搭建 FFmpeg 命令行运行环境 [FFmpeg]FFmpeg 相关术语简介 [FFmpeg]FFmpeg 相关术语简介 二 [FFmpe ...

  3. 使用ffmpeg打印音视频的详细信息

    使用ffmpeg打印音视频的详细参数非常简单,仅仅需要三个函数接口实现: /*所有进行操作前,先执行以下,否则需要自己制定类型*/av_register_all/*Open an input stre ...

  4. FFmpeg Android 学习(一):Android 如何调用 FFMPEG 编辑音视频

    一.概述 在Android开发中,我们对一些音视频的处理比较无力,特别是编辑音视频这部分.而且在Android上对视频编辑方面,几乎没有任何API做支持,MediaCodec(硬编码)也没有做支持.那 ...

  5. FFMPEG开源音视频项目学习汇总

    ~非常感谢雷霄骅老师的无私帮助,本文转载自:http://blog.csdn.net/leixiaohua1020/article/details/42658139~       本文汇总一下自己视音 ...

  6. C# 调用FFmpeg处理音视频的示例

    FFmpeg 开源.跨平台.体积小.功能强大,提供了录制.转换以及流化音视频的完整解决方案. 官网:https://www.ffmpeg.org/ 百科:https://baike.baidu.com ...

  7. javaCV入门指南:调用FFmpeg原生API和JavaCV是如何封装了FFmpeg的音视频操作?

    JavaCV入门指南系列: JavaCV入门指南:序章(看完本章后,不想看原理的小伙伴可直接跳转到<快速上手篇>) JavaCV入门指南:调用FFmpeg原生API和JavaCV是如何封装 ...

  8. 《2019/04/12》java下载抖音视频

    java下载抖音视频 下载抖音视频,获取到抖音视频的下载地址之后,类似: String url = "https://aweme.snssdk.com/aweme/v1/play/?vide ...

  9. linux下ffmpeg采集音视频设备

    Linux下查看音视频设备 1.视频输入设备: 命令查看:ls /sys/class/video4linux/ 执行结果如下: 如果系统存在video4linux文件夹说明已安装过视频驱动,video ...

最新文章

  1. Intent、Bundle
  2. EasyUi 改变 selelct 的 下拉内容 div 的高度
  3. php 中文 处理,PHP处理中文字符串截取
  4. 项目中常用的 19 条 MySQL 优化总结
  5. React-Native学习指南
  6. Echarts作图之柏拉图
  7. 致27岁的老光棍天空
  8. redis可以存多少条数据_在银行存50万元,一年能有多少利息?不工作可以吗?...
  9. c语言 手机图形库,c语言的图形库 - osc_opiar5rp的个人空间 - OSCHINA - 中文开源技术交流社区...
  10. Node.js入门笔记
  11. js中DOM, DOCUMENT, BOM, WINDOW 区别
  12. 创业失败反思:市场跟销售完全是两回事
  13. 创建oracle系统dsn,timesten创建dsn
  14. 信息系统的风险评估过程与评估方法
  15. 基于Qt的NAT检测和NAT穿透
  16. TVP5150视频解码芯片 调试总结
  17. Azure微软云(部署一台虚拟机云服务器)
  18. JavaScript的通用库与动画特效
  19. Win10双屏显示设置教程
  20. 开发多商家商城系统的功能优势

热门文章

  1. db与dbm(分贝与分贝毫)
  2. TypeError: Cannot read property ‘replace‘ of undefined
  3. 听你声音6秒,AI就能推断你长啥样了!| 技术前沿洞察
  4. 天图投资收购全球第二大酸奶品牌优诺在华业务
  5. python爬取热门新闻每日排行_爬取网易新闻排行榜
  6. 七窍通五脏:心气足则味觉灵 肺燥热则鼻孔干 身体流出 5种 液体对应五脏
  7. 哪个世纪末最后一天是周日
  8. 搞笑能火的爆款短视频选题
  9. STM32和GD32有什么区别?
  10. 事务处理SqlTransaction