当前支持,后续继续补充
- 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