You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 04:16:09