当前位置: 首页 > news >正文

使用ffmpeg实现音视频文件格式转换

当前支持,后续继续补充

  •   1、支持音频文件转mp3;
  •    2、支持视频文件转mp4;
  •    3、支持视频提取音频;

1、转换类


import lombok.extern.slf4j.Slf4j;import java.io.BufferedReader;
import java.io.File;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.HashSet;
import java.util.Set;
import java.util.concurrent.TimeUnit;/***** @author xuancg* 要求系统内置ffmpeg工具环境* @date 2024/9/23*/
@Slf4j
public class FfmpegUtil {private static final String CONVERT_MP3 = "ffmpeg -i %s %s";private static final String CONVERT_MP4 = "ffmpeg -i %s -c:v libx264 -c:a copy %s";private static final String EXTRACT_MP3 = "ffmpeg -i %s -q:a 0 -map a %s";private static final Set<String> MP3_TYPE = new HashSet<>(Arrays.asList("mp3", "wav", "aac", "flac"));private static final Set<String> MP4_TYPE = new HashSet<>(Arrays.asList("mp4", "avi", "flv", "mpeg", "wmv"));/**** 音视频文件格式化* 1、支持音频文件转mp3;* 2、支持视频文件转mp4;* 3、支持视频提取音频;*/public static boolean convertMedia(MediaConvertBo convertBo) {File src = convertBo.getSrc();File dest = convertBo.getDest();if (null == src || !src.isFile()) {log.error("原始文件不存在");return false;}if (null != dest && dest.isFile()) {log.info("目标文件已存在");}long start = System.currentTimeMillis();Process process = null;BufferedReader reader = null;try {String cmd = createCmd(convertBo);if(null == cmd){return false;}log.info("ffmpeg执行命令=" + cmd);// 执行命令process = Runtime.getRuntime().exec(cmd);// 获取命令输出结果reader = new BufferedReader(new InputStreamReader(process.getErrorStream()));String line;while ((line = reader.readLine()) != null) {log.debug(line);}// 明确自己的命令需要执行多长时间,否则可以一直等待int timeout = convertBo.getTimeout();if (timeout <= 0) {process.waitFor();} else {process.waitFor(timeout, TimeUnit.SECONDS);}return dest.isFile() && dest.length() > 10;} catch (IOException e) {e.printStackTrace();} catch (InterruptedException e) {log.error("剪裁视频超时source=" + src.getAbsolutePath());} finally {if (null != process) {process.destroy();}if (null != reader) {try {reader.close();} catch (IOException e) {log.error("关闭流失败" + e.getMessage());}}log.info("耗时ms=" + (System.currentTimeMillis() - start));}return false;}public static boolean isMp4File(File file){String name = file.getName();String suffix = name.substring(name.lastIndexOf(".") + 1);return MP4_TYPE.contains(suffix);}public static boolean isMp3File(File file){String name = file.getName();String suffix = name.substring(name.lastIndexOf(".") + 1);return MP3_TYPE.contains(suffix);}private static final String createCmd(MediaConvertBo bo) {File src = bo.getSrc();if (bo.isConvertMp3()) {if(!isMp3File(src)){log.error("错误的mp3格式");return null;}return String.format(CONVERT_MP3, src.getAbsolutePath().replace("\\", "/"), bo.getDest().getAbsolutePath().replace("\\", "/"));} else if (bo.isConvertMp4()) {if(!isMp4File(src)){log.error("错误的mp4格式");return null;}return String.format(CONVERT_MP4, src.getAbsolutePath().replace("\\", "/"), bo.getDest().getAbsolutePath().replace("\\", "/"));} else if(bo.getType() == MediaConvertBo.Type.EXTRACT_MP3){if(!isMp4File(src)){log.error("错误的mp4格式");return null;}return String.format(EXTRACT_MP3, src.getAbsolutePath().replace("\\", "/"), bo.getDest().getAbsolutePath().replace("\\", "/"));}log.error("错误的type");return null;}}

2、请求对象

import lombok.Data;import java.io.File;/***** @author xuancg* @date 2024/9/23*/
@Data
public class MediaConvertBo {private File src;private File dest;/**0表示持续等待,单位秒*/private int timeout = 0;private Type type;public boolean isConvertMp3(){return null != type && type == Type.CONVERT_MP3;}public boolean isConvertMp4(){return null != type && type == Type.CONVERT_MP4;}public enum Type {/***/CONVERT_MP4,CONVERT_MP3,EXTRACT_MP3;}}

3、ffmpeg配置环境变量

在Windows上安装并配置FFmpeg的环境变量,请按照以下步骤操作:

1)下载FFmpeg:

访问FFmpeg官网(https://ffmpeg.org/download.html)下载对应于你的操作系统的FFmpeg静态构建。

2)解压缩:

将下载的压缩包解压到你选择的目录,例如:C:\ffmpeg\。

3)配置环境变量:

  • 右键点击“我的电脑”或者“此电脑”,选择“属性”。
  • 点击“高级系统设置”。
  • 在“系统属性”窗口中选择“环境变量”。
  • 在“系统变量”区域找到并选择“Path”变量,点击“编辑”。
  • 点击“新建”,添加FFmpeg的bin目录到路径中,例如:C:\ffmpeg\bin。
  • 点击“确定”保存所有设置。

5)验证安装:

打开命令提示符(CMD)或者PowerShell,输入以下命令来检查FFmpeg是否正确安装和配置:

ffmpeg -version

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 深入解析Linux驱动开发中的I2C时序及I2C高频面试题
  • web基础—dvwa靶场(七)SQL Injection
  • 深度deepin初体验(一)系统详细安装过程 | 国产系统
  • patch 命令:补丁的应用
  • SpringBoot+Aop+注解方式 实现多数据源动态切换
  • [游戏技术]L4D服务器报错解决
  • 31省市农业地图大数据
  • 开源RK3588 AI Module7,并与Jetson Nano生态兼容的低功耗AI模块
  • Django学习实战篇四(适合略有基础的新手小白学习)(从0开发项目)
  • 零工市场小程序:推动零工市场建设
  • MySQL Performance Schema 详解及运行时配置优化
  • 计算机前沿技术-人工智能算法-大语言模型-最新论文阅读-2024-09-20
  • Nginx 反向代理
  • 随手记:前端一些定位bug的方法
  • 大语言模型量化方法GPTQ、GGUF、AWQ详细原理
  • 【comparator, comparable】小总结
  • 〔开发系列〕一次关于小程序开发的深度总结
  • 0x05 Python数据分析,Anaconda八斩刀
  • canvas 绘制双线技巧
  • k8s 面向应用开发者的基础命令
  • Kibana配置logstash,报表一体化
  • MySQL的数据类型
  • nginx(二):进阶配置介绍--rewrite用法,压缩,https虚拟主机等
  • python_bomb----数据类型总结
  • vue-router 实现分析
  • 技术攻略】php设计模式(一):简介及创建型模式
  • 聚类分析——Kmeans
  • 如何打造100亿SDK累计覆盖量的大数据系统
  • 手写双向链表LinkedList的几个常用功能
  • 以太坊客户端Geth命令参数详解
  • 阿里云ACE认证之理解CDN技术
  • ​sqlite3 --- SQLite 数据库 DB-API 2.0 接口模块​
  • ### Error querying database. Cause: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException
  • #Linux杂记--将Python3的源码编译为.so文件方法与Linux环境下的交叉编译方法
  • ( )的作用是将计算机中的信息传送给用户,计算机应用基础 吉大15春学期《计算机应用基础》在线作业二及答案...
  • (C++17) optional的使用
  • (C语言)fread与fwrite详解
  • (C语言)深入理解指针2之野指针与传值与传址与assert断言
  • (DFS + 剪枝)【洛谷P1731】 [NOI1999] 生日蛋糕
  • (poj1.2.1)1970(筛选法模拟)
  • (八十八)VFL语言初步 - 实现布局
  • (博弈 sg入门)kiki's game -- hdu -- 2147
  • (不用互三)AI绘画:科技赋能艺术的崭新时代
  • (分布式缓存)Redis哨兵
  • (六)DockerCompose安装与配置
  • (亲测成功)在centos7.5上安装kvm,通过VNC远程连接并创建多台ubuntu虚拟机(ubuntu server版本)...
  • (全注解开发)学习Spring-MVC的第三天
  • (十六)Flask之蓝图
  • (一)插入排序
  • .cn根服务器被攻击之后
  • .net core使用ef 6
  • .net 按比例显示图片的缩略图
  • .NET大文件上传知识整理
  • .net专家(张羿专栏)
  • /proc/stat文件详解(翻译)