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 小时前
WiFi密码B破器-密码查看器、可跑字典-免费无广
windows·wifi·工具
johnny2334 天前
远程桌面工具汇总:RustDesk、1Remote、CrossDesk
工具
私人珍藏库4 天前
[Windows] 漫画翻译工具Saber Translator2.5.1
windows·动画·工具·翻译
xixixi777774 天前
了解一个开源网络数据采集软件包——Libcap
网络·安全·工具
KG_LLM图谱增强大模型5 天前
[Nature子刊]浙大SciToolAgent:用知识图谱驱动的科学智能体实现多工具集成
大模型·知识图谱·工具·科学研究·graphrag
私人珍藏库8 天前
小叮当W信助手v0.1.0
pc·工具·软件
br456vv16 天前
Adobe Dimension 2025 (3D可视化设计神器) 解锁版
java·adobe·工具
NFG89C17 天前
Adobe Lightroom Classic 2025解锁版 (专业照片管理)
java·adobe·工具
bb456b17 天前
Snipaste (截图贴图工具) 精准截图 中文免费版
java·工具·贴图
bin915317 天前
AI工具赋能Python开发者:项目开发中的创意守护与效率革命
开发语言·人工智能·python·工具·ai工具