如何在Java程序中使用FFmpeg命令行工具?
嘿,你的这个Java调用FFmpeg做视频转换的思路完全没问题,我帮你把代码整理得更规范,再补充几个容易踩坑的关键细节:
Java调用FFmpeg实现视频格式转换
核心实现代码
你给出的基础代码可以优化得更健壮,比如增加输出捕获、错误处理等逻辑:
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.ArrayList; import java.util.List; public class FFmpegVideoConverter { public static void main(String[] args) { // 构建FFmpeg命令参数列表 List<String> cmds = new ArrayList<>(); // 注意:如果FFmpeg未加入系统PATH,这里要写绝对路径,比如Windows下的"C:/ffmpeg/bin/ffmpeg.exe",Linux/Mac下的"/usr/bin/ffmpeg" cmds.add("ffmpeg"); cmds.add("-i"); cmds.add("video1.avi"); // 输入视频文件路径 cmds.add("video2.mp4"); // 输出视频文件路径 cmds.add("-hide_banner"); // 隐藏FFmpeg启动横幅信息 ProcessBuilder pb = new ProcessBuilder(cmds); // 可选:设置进程工作目录,比如指定视频所在的目录 // pb.directory(new File("/path/to/your/video/folder")); try { Process conversionProcess = pb.start(); // 必须异步读取FFmpeg的输出流,否则缓冲区满会导致进程阻塞 // 读取标准输出 new Thread(() -> { try (BufferedReader stdOutReader = new BufferedReader(new InputStreamReader(conversionProcess.getInputStream()))) { String line; while ((line = stdOutReader.readLine()) != null) { System.out.println("FFmpeg日志: " + line); } } catch (IOException e) { e.printStackTrace(); } }).start(); // 读取错误输出(排查转换失败原因很重要) new Thread(() -> { try (BufferedReader stdErrReader = new BufferedReader(new InputStreamReader(conversionProcess.getErrorStream()))) { String line; while ((line = stdErrReader.readLine()) != null) { System.err.println("FFmpeg错误信息: " + line); } } catch (IOException e) { e.printStackTrace(); } }).start(); // 等待转换进程完成 int exitCode = conversionProcess.waitFor(); if (exitCode == 0) { System.out.println("视频转换成功完成!"); } else { System.out.println("视频转换失败,进程退出码: " + exitCode); } } catch (IOException | InterruptedException e) { e.printStackTrace(); } } }
关键注意事项
- FFmpeg路径配置:如果你的FFmpeg没有添加到系统环境变量
PATH中,一定要在命令列表里写FFmpeg可执行文件的绝对路径,否则程序会找不到FFmpeg。 - 文件权限与路径:确保输入视频文件存在且程序有读取权限;输出路径所在的目录要有写入权限,避免因权限不足导致转换失败。
- 避免进程阻塞:FFmpeg运行时会产生大量输出,如果不读取
getInputStream()和getErrorStream(),进程会因为输出缓冲区被填满而卡住,所以必须异步启动线程读取这些流。 - 扩展转换参数:如果需要更复杂的转换需求(比如调整分辨率、比特率、帧率),可以直接在命令列表中添加对应参数,比如
cmds.add("-s"); cmds.add("1920x1080");来设置输出分辨率。
内容的提问来源于stack exchange,提问作者Yorbenys Pardo Rodríguez
相关产品推荐
相关产品推荐

