FFmpeg的安装及简单使用

简介

FFmpeg 是一个跨平台的音视频处理工具库/命令行工具,其核心作用是:对音视频文件或流进行解码、转换(编码)、封装/解封装等处理。

友情提示

本次安装以Windows64位操作系统为例

一、下载及安装

1、前往FFmpeg官网,点击下载

这里我们以Windows builds from gyan.dev为例

2、进来以后选择release builds

这边我们选择右边的1或者2都可,选择其一就可以然后shared和不带shared主要区别就是戴shared是把依赖包全部放在lib文件下面然后ffmpeg.exe,ffplay.exe,ffprobe.exe作为可执行文件就可以直接去lib里面调用相应功能,而不带shared的他的ffmpeg.exe,ffplay.exe,ffprobe.exe作为独立的执行的单独模块会在bin得目录下,每个文件就会大一些。这里我们以下载ffmpeg-7.0.2-full_build.7z为例

3、下载解压完成后我们就得到了如下的目录

点击bin目录我们就可以看见那三个主要的文件

二、环境变量设置

1、右击此电脑选择属性

2、选择高级系统设置,选择环境变量

3、在系统变量中选择path进行编辑

4、将bin的路径直接复制过去,然后一定要把所有确定按钮点完

5、检验是否生效

cmd输入ffmpeg -version 如果出现版本号就说明配置成功

三、Java代码中ffmpeg的调用

ffmpeg过于强大,这里咱们就举几个简单例子展示一下ffmpeg的基本功能!

1、获取视频信息

复制代码
    public static void main(String[] args) {
        try {
            // 获取视频信息
            getVideoInfo("D:/video/lin.mp4");
        } catch (IOException | InterruptedException e) {
            e.printStackTrace();
        }
    }
    public static void getVideoInfo(String videoPath) throws IOException, InterruptedException {
        ProcessBuilder processBuilder = new ProcessBuilder("ffmpeg", "-i", videoPath);
        Process process = processBuilder.start();
        process.waitFor();
        printCommandOutput(process.getErrorStream());
    }

    private static void printCommandOutput(InputStream inputStream) throws IOException {
        InputStreamReader inputStreamReader = new InputStreamReader(inputStream);
        BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
        String line;
        while ((line = bufferedReader.readLine()) != null) {
            System.out.println(line);
        }
    }

首先这里包含了视频的基本信息,路径:'D:/video/lin.mp4' 格式为MP4

Stream #0:00x1表示视频流:

Video: h264 (High) 表示视频流使用的是H.264编码,且为高配置文件。

yuv420p(tv, bt709, progressive) 是视频的像素格式,色域和扫描方式。

544x960 是视频的分辨率。

655 kb/s 是视频流的比特率。

23 fps 是视频的帧率。

23 tbr 是时间基准。

90k tbn 是时间基准。

Stream #0:10x2 表示音频流的信息:

Audio: aac (LC) 表示音频流使用的是AAC编码,低复杂度配置文件。

44100 Hz 是音频的采样率。

mono 表示音频是单声道的。

fltp 是音频样本格式。

48 kb/s 是音频流的比特率。

2、给视频加字幕

复制代码
    public static void main(String[] args) {
        try {
            // 视频添加字幕
            addSubtitle("D:/video/lin.mp4", "D:/video/lin.srt", "D:/video/lin_with_subtitle.mp4");
        } catch (IOException | InterruptedException e) {
            e.printStackTrace();
        }
    }
    public static void addSubtitle(String videoPath, String subtitlePath, String outputPath)
            throws IOException, InterruptedException {
        String escapedSubPath = subtitlePath.replace("\\", "\\\\").replace(":", "\\:");
        // 使用完整FFmpeg命令参数
        ProcessBuilder processBuilder = new ProcessBuilder(
                "ffmpeg",
                "-i", videoPath,
                "-vf", "subtitles='" + escapedSubPath + "'", // 用单引号包裹路径
                "-c:v", "libx264",     // 指定视频编码器
                "-c:a", "copy",        // 直接复制音频流
                "-y",                   // 覆盖输出文件
                outputPath
        );
        // 打印实际执行的命令
        System.out.println("执行命令: " + String.join(" ", processBuilder.command()));
        Process process = processBuilder.start();
        printCommandOutput(process.getErrorStream());
        int exitCode = process.waitFor();
        if (exitCode == 0) {
            System.out.println("字幕添加成功!");
        } else {
            System.out.println("处理失败,退出码: " + exitCode);
        }
    }

    private static void printCommandOutput(InputStream inputStream) throws IOException {
        InputStreamReader inputStreamReader = new InputStreamReader(inputStream);
        BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
        String line;
        while ((line = bufferedReader.readLine()) != null) {
            System.out.println(line);
        }
    }

这是一个srt的字幕文件,简单用Windows自带的txt写了一个简单的的srt文件,内容就如上所示

这个就是生成的结果,lin是原视频,lin.srt是字幕文件,lin_with_subtitle是生成后带字幕的文件

上面两个就为原视频带字幕前后的对比了

3、添加水印的操作

复制代码
    public static void main(String[] args) {
        try {
            // 给视频添加水印
            addWatermark("D:/video/lin.mp4","D:/video/lin.png","D:/video/lin_watermark.mp4");
        } catch (IOException | InterruptedException e) {
            e.printStackTrace();
        }
    }

    public static void addWatermark(String videoPath, String watermarkPath, String outputPath)
            throws IOException, InterruptedException {

        // 构造FFmpeg命令(支持透明PNG/动态调整位置)
        ProcessBuilder processBuilder = new ProcessBuilder(
                "ffmpeg",
                "-i", videoPath,          // 输入视频
                "-i", watermarkPath,      // 输入水印图片
                "-filter_complex",
                "[1]format=rgba," +                   // 确保水印有透明通道
                        "scale=iw/3:ih/3," +                 // 缩小3倍(iw/3=原宽度÷3)
                        "colorchannelmixer=aa=0.25[wm];" +    // 透明度25%
                        "[0][wm]overlay=25:H-h-25",           // 左下角位置(左边25px,底部25px)
                "-c:v", "libx264",        // 视频编码
                "-preset", "fast",        // 编码速度
                "-crf", "23",             // 画质控制
                "-c:a", "copy",           // 复制音频流
                "-y",                     // 覆盖输出
                outputPath
        );

        // 打印实际执行的命令
        System.out.println("执行命令: " + String.join(" ", processBuilder.command()));

        Process process = processBuilder.start();
        printCommandOutput(process.getErrorStream()); // FFmpeg输出到stderr
        int exitCode = process.waitFor();

        if (exitCode == 0) {
            System.out.println("水印添加成功!");
        } else {
            System.out.println("处理失败,退出码: " + exitCode);
        }
    }
    private static void printCommandOutput(InputStream inputStream) throws IOException {
        InputStreamReader inputStreamReader = new InputStreamReader(inputStream);
        BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
        String line;
        while ((line = bufferedReader.readLine()) != null) {
            System.out.println(line);
        }
    }

这里主要除了固定水印位置还可以设置移动水印的效果

好了以上就是全部内容,当然FFmpeg的功能绝对不仅仅于此,还可以对视频音频进行降噪处理、关键帧的提取、Ai集成、滤镜等等。在目前企业中也被广泛应用。只是作者在这里偷个懒~就不全部展示了。

相关推荐
小徐不徐说1 天前
VS 2022 Visual Assist 破解
c++·visualstudio·工具·插件
人间凡尔赛1 天前
2026 开发者效率新基建:Agent Plugins 1.0 规范解读与 MCP 实战
ai·工具·效率
小当家.1053 天前
工具并行调用原理与实现:CompletableFuture 实战
java·agent·线程池·工具·并行
人间凡尔赛8 天前
AI 编程进入 Agent 时代:2026 年 CLI 效率工具实战指南(Claude Code × Codex 横评)
开发·工具·效率
网络研究院9 天前
一款利用人工智能将电子游戏翻译成任何语言的桌面应用程序
人工智能·游戏·工具·平台·翻译·软件
栈溢出的浪漫9 天前
Python单元测试框架覆盖率-Coverage
python·单元测试·工具·覆盖率·coverage
欢乐小红10 天前
GEO项目验收标准:如何辨别竞品对比数据的真实价值?
ai·工具
啦啦啦啦啦zzzz10 天前
工具:动态类工厂和用配置文件存储属性
c++·设计模式·工具·动态工厂
欢乐小红11 天前
本地生活AI获客选型:轻量化GEO工具vs全链路平台,怎么选
ai·工具
人间凡尔赛13 天前
2026年AI编程新范式:从Copilot到Agentic Coding的实战指南
ai·编程·agent·工具·效率