背景
想要把音频采样率为24000的mp3修改44100的mp3 ,感觉执行FFmpeg命令方式比较简单直接,本次采用了这种方式
使用FFmpeg修改音频采样率
经过AI工具得知命令如下
ffmpeg -i input.mp3 -ar 44100 output.mp3
命令解析
-i:这是“input”的缩写,代表输入文件。后面应该跟着输入文件的路径。
-ar:这是“audio rate”的缩写,用于设置音频的采样率。在您给出的命令中,它被设置为 44100,这是常见的音频采样率,表示每秒采样44100次。
然后用Java调用该命令即可
@Slf4j
public class FFmpegUtils {
private static String FFMPEG_PATH = "C:\\soft\\ffmpeg\\ffmpeg\\ffmpeg\\bin\\ffmpeg.exe";
public static boolean execute(String srcPath, String destPath, String... params) {
File file = new File(destPath);
File parent = file.getParentFile();
if (!parent.exists()) {
parent.mkdirs();
}
StringBuilder cmd = new StringBuilder();
cmd.append(FFMPEG_PATH);
cmd.append(" ");
cmd.append("-i " + srcPath);
if (params != null && params.length > 0) {
for (String param : params) {
cmd.append(" ").append(param).append(" ");
}
}
cmd.append(" ");
cmd.append(destPath);
boolean result = true;
try {
Process proc = Runtime.getRuntime().exec(cmd.toString());
FFmpegInterceptor error = new FFmpegInterceptor(proc.getErrorStream());
FFmpegInterceptor output = new FFmpegInterceptor(proc.getInputStream());
error.run();
output.run();
proc.waitFor();
} catch (Exception e) {
result = false;
log.error("ffmeg执行失败", e);
}
return result;
}
}
@Test
public void updateSimpleRate() throws Exception {
String descPath = "C:\\Users\\Administrator\\Desktop\\output22.mp3";
String srcPath = "C:\\Users\\Administrator\\Desktop\\6f69d97cc97e4c8a9a8dcec7b1cb85ab.mp3";
FFmpegUtils.execute(srcPath, descPath, "-ar 44100");
}
Runtime.getRuntime():是一个静态方法,用于获取当前Java应用程序的运行时环境实例
exec() :可以执行外部程序,模拟终端或命令行的行为
以下是 Runtime.getRuntime().exec() 方法的一些关键作用和特性
1. 执行外部命令:可以用来执行任何可以在命令行直接输入的操作系统命令或可执行文件,比如打开浏览器、运行脚本、调用系统工具(如 ffmpeg)等。
2. 创建子进程:当调用 exec() 方法时,Java虚拟机会创建一个新的子进程来执行指定的命令,这意味着外部命令是在与Java程序分离的进程中运行的。
3. 重定向IO流:通过返回的 Process 对象,可以控制外部程序的输入输出。你可以获取子进程的输入流、输出流和错误流,从而读取命令输出,向命令发送输入数据,或捕获命令执行过程中的错误信息。
4. 等待命令完成:通过 Process 对象的 waitFor() 方法,可以让主程序等待子进程结束,获取其退出状态码,判断命令是否成功执行。
5. 环境变量配置:某些重载的 exec() 方法允许传递环境变量数组,这样可以在特定的环境中执行命令。
6. 资源管理:虽然 exec() 提供了强大的功能,但使用时需谨慎,因为它可能影响系统资源,如未正确处理流可能导致死锁,或者过多的子进程消耗系统资源