沉梦听雨的编程指南 沉梦听雨的编程指南
首页
  • 基础篇
  • 集合篇
  • 并发篇
  • JVM
  • 新特性
  • 计算机网络
  • 操作系统
  • 数据结构与算法
  • 基础篇
  • MySql
  • Redis
  • 达梦数据库
  • Spring
  • SpringBoot
  • Mybatis
  • Shiro
  • 设计须知
  • UML画图
  • 权限校验
  • 设计模式
  • API网关
  • RPC
  • 消息队列
  • SpringCloud
  • 分布式事务
  • 云存储
  • 搜索引擎
  • 多媒体框架
  • 虚拟机
  • 开发工具篇
  • 工具库篇
  • 开发技巧篇
  • 工具类系列
  • 随笔
  • 前端环境搭建
  • HTML与CSS
  • JS学习
  • Axios入门
  • Vue Router入门
  • Pinia入门
  • Vue3入门
  • Vue3进阶
  • 黑马Vue3
  • 脚手架搭建
  • 瑞吉外卖
  • 黑马点评
  • vue-blog
  • 沉梦接口开放平台
  • 用户中心
  • 聚合搜索平台
  • 仿12306项目
  • 壁纸小程序项目
  • RuoYi-Vue
  • 博客搭建
  • 网站收藏箱
  • 断墨寻径摘录
  • 费曼学习法
Github (opens new window)

沉梦听雨

时间是最好的浸渍剂,而沉淀是最好的提纯器🚀
首页
  • 基础篇
  • 集合篇
  • 并发篇
  • JVM
  • 新特性
  • 计算机网络
  • 操作系统
  • 数据结构与算法
  • 基础篇
  • MySql
  • Redis
  • 达梦数据库
  • Spring
  • SpringBoot
  • Mybatis
  • Shiro
  • 设计须知
  • UML画图
  • 权限校验
  • 设计模式
  • API网关
  • RPC
  • 消息队列
  • SpringCloud
  • 分布式事务
  • 云存储
  • 搜索引擎
  • 多媒体框架
  • 虚拟机
  • 开发工具篇
  • 工具库篇
  • 开发技巧篇
  • 工具类系列
  • 随笔
  • 前端环境搭建
  • HTML与CSS
  • JS学习
  • Axios入门
  • Vue Router入门
  • Pinia入门
  • Vue3入门
  • Vue3进阶
  • 黑马Vue3
  • 脚手架搭建
  • 瑞吉外卖
  • 黑马点评
  • vue-blog
  • 沉梦接口开放平台
  • 用户中心
  • 聚合搜索平台
  • 仿12306项目
  • 壁纸小程序项目
  • RuoYi-Vue
  • 博客搭建
  • 网站收藏箱
  • 断墨寻径摘录
  • 费曼学习法
Github (opens new window)
  • API网关

  • RPC

  • 消息队列

  • Spring Cloud

  • 分布式事务

  • 云存储

  • 搜索引擎

  • 多媒体框架

    • ffmpeg入门
      • 1. FFmpeg 基础概念
        • 1.1 什么是 FFmpeg?
        • 1.2 GOP 与帧类型
        • 1.3 命令格式概述
      • 2. 常用 FFmpeg 命令示例
        • 2.1 格式转换
        • 2.2 视频剪辑
        • 2.3 提取或去除音频
        • 2.4 拼接视频
        • 2.5 转换视频到 GIF
        • 2.6 添加滤镜
        • 2.7 获取视频时长
      • 3. 在 Java 中调用 FFmpeg
        • 3.1 通过 Runtime/ProcessBuilder 调用命令行
        • 3.2 使用 Java 封装库
        • 3.3 Maven 依赖版本对应
      • 4. 实践案例:构建视频剪辑服务
      • 5. 小结与扩展学习
      • 6. FFmpeg 安装与配置
      • 学习参考
    • ffmpeg参数篇
    • ffmpeg实现视频转码
    • ffmpeg实现视频流抽帧
  • 虚拟机

  • 微服务
  • 多媒体框架
沉梦听雨
2025-01-24
2.1k
8.6m
目录
1. FFmpeg 基础概念
1.1 什么是 FFmpeg?
1.2 GOP 与帧类型
1.3 命令格式概述
2. 常用 FFmpeg 命令示例
2.1 格式转换
2.2 视频剪辑
2.3 提取或去除音频
2.4 拼接视频
2.5 转换视频到 GIF
2.6 添加滤镜
2.7 获取视频时长
3. 在 Java 中调用 FFmpeg
3.1 通过 Runtime/ProcessBuilder 调用命令行
3.2 使用 Java 封装库
3.3 Maven 依赖版本对应
4. 实践案例:构建视频剪辑服务
5. 小结与扩展学习
6. FFmpeg 安装与配置
学习参考

ffmpeg入门

# ffmpeg 入门

# 1. FFmpeg 基础概念

# 1.1 什么是 FFmpeg?

FFmpeg 是一个开源的多媒体处理工具包,包含了用于解码、编码、转码、复用(mux)、解复用(demux)、流媒体传输、过滤和播放几乎所有音视频格式的程序和库。

其主要组件包括:

  • ffmpeg 命令行工具:用于进行音视频文件转换、剪辑、合并、滤镜处理等任务。
  • ffprobe:用于分析多媒体文件,获取格式、码率、帧率、时长等信息。
  • ffplay:一个简单的基于 SDL 的播放器,用于快速预览文件内容。

# 1.2 GOP 与帧类型

在视频编码中,FFmpeg 常用 GOP(Group of Pictures,图像组)结构来描述帧之间的依赖关系:

  • I 帧(Intra-coded frame):完全独立的帧,可作为关键帧进行随机访问。
  • P 帧(Predictive frame):利用之前的 I 或 P 帧预测编码,数据量较小。
  • B 帧(Bidirectionally predictive frame):利用前后帧进行双向预测,压缩率更高但解码复杂度更大。

理解 GOP 结构有助于调优编码参数以及在剪辑、流媒体等场景下合理设置关键帧间隔,从而平衡文件大小和视频质量。

# 1.3 命令格式概述

FFmpeg 命令行工具的基本语法大致如下:

ffmpeg [全局参数] {[输入选项] -i 输入文件}... {[输出选项] 输出文件}...
1
  • 全局参数:对整个命令有效,如 -y(覆盖输出文件)、-loglevel(设置日志级别)等。
  • 输入选项:放在 -i 前面的参数,只对紧跟其后的输入文件生效,例如 -ss 用于设置起始时间(快速定位输入流)。
  • 输出选项:出现在输入文件之后,专门控制输出文件的编码、格式等,如 -c:v(指定视频编码器)、-b:a(音频比特率)等。

这类结构让 FFmpeg 的命令既灵活又具有明确的定位意义,输入选项和输出选项分别对应数据的不同处理阶段。

# 2. 常用 FFmpeg 命令示例

下面介绍一些典型的 FFmpeg 命令和用法,方便你在实际项目中快速上手:

# 2.1 格式转换

将 MP4 文件转换为 WebM:

ffmpeg -i input.mp4 output.webm

# 或指定编码器参数进行更精细的控制
ffmpeg -i input.mp4 -c:v libvpx-vp9 -c:a libopus output.webm
1
2
3
4

将 MP4 文件转换为 MKV,并指定编码器:

ffmpeg -y -i input.mp4 -c:v libx264 -preset fast -crf 23 -c:a aac -b:a 128k output.mkv
1
  • 这里 -preset fast 表示编码速度设为“快”,-crf 23 控制输出视频质量。

# 2.2 视频剪辑

不重新编码快速剪辑视频(通过复制流):

  • -ss 位于输入前实现快速定位,而 -t 表示截取的时长,-c copy 表示不重新编码,直接复制数据流。
ffmpeg -ss 00:00:10 -t 00:00:20 -i input.mp4 -c copy clip.mp4
1
  • 若需要重新编码,可省略 -c copy:
ffmpeg -ss 00:00:10 -t 00:00:20 -i input.mp4 -c:v libx264 -c:a aac clip.mp4
1

# 2.3 提取或去除音频

提取视频中的音频:

ffmpeg -i input.mp4 -vn output.mp3
1

去除视频中的音频(静音视频):

ffmpeg -i input.mp4 -an -c:v copy muted.mp4
1

# 2.4 拼接视频

首先创建一个文件列表 filelist.txt:

file 'part1.mp4'
file 'part2.mp4'
file 'part3.mp4'
1
2
3

然后执行:

ffmpeg -f concat -safe 0 -i filelist.txt -c copy output.mp4
1

# 2.5 转换视频到 GIF

生成 GIF 动画:

ffmpeg -i input.mp4 -vf "fps=10,scale=320:-1:flags=lanczos" -c:v gif output.gif
1

# 2.6 添加滤镜

缩放视频并在视频上叠加文字:

  • -vf:视频滤镜,用于执行缩放、裁剪、叠加文字等操作。
ffmpeg -y -i input.mp4 -vf "scale=640:360,drawtext=text='FFmpeg':fontcolor=white:fontsize=24:x=10:y=10" output.mp4
1

# 2.7 获取视频时长

FFmpeg 还提供了一个专门的工具 ffprobe,它可以更方便地获取视频的元数据信息,包括时长。

使用以下命令将直接输出视频的时长(以秒为单位),例如:

ffprobe -i input.mp4 -show_entries format=duration -v quiet -of csv="p=0"
1

# 3. 在 Java 中调用 FFmpeg

在 Java 应用中,通常有两种方式调用 FFmpeg:

# 3.1 通过 Runtime/ProcessBuilder 调用命令行

利用 Java 自带的 Runtime.getRuntime().exec() 或 ProcessBuilder,直接调用 FFmpeg 命令。

例如,下面的示例代码展示了如何调用 FFmpeg 剪辑视频片段:

public class FFmpegProcess {
    public static void main(String[] args) throws Exception {
        String inputFile = "input.mp4";
        String outputFile = "clip.mp4";
        // 从 10 秒开始剪辑 20 秒的视频
        String command = String.format("ffmpeg -ss 00:00:10 -i %s -t 00:00:20 -c copy %s", inputFile, outputFile);
        ProcessBuilder builder = new ProcessBuilder();
        builder.command("bash", "-c", command); // Linux/macOS;Windows 下可直接使用 "cmd", "/c", command
        Process process = builder.start();
        process.waitFor();
        System.out.println("剪辑完成");
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13

这种方法简单直接,但对错误处理和跨平台兼容性需要开发者自行处理。

# 3.2 使用 Java 封装库

有不少 Java 封装库对 FFmpeg 进行了包装,使得你可以以更面向对象的方式使用 FFmpeg。

常见的有:

  • Jaffree:一个基于命令行调用的轻量级 Java 封装库,支持视频转码、剪辑、流处理等。Jaffree 提供了 fluent API,简化了命令构造。
  • JavaCV:JavaCV 是 OpenCV 与 FFmpeg 的 Java 封装库,除了视频处理,还提供了计算机视觉相关的功能。它的许可证 Apache 2.0 适合闭源应用。

例如,使用 Jaffree 调用 FFmpeg 进行视频剪辑的代码示例:

import com.github.kokorin.jaffree.ffmpeg.FFmpeg;
import com.github.kokorin.jaffree.ffmpeg.FFmpegResult;

public class JaffreeExample {
    public static void main(String[] args) {
        FFmpegResult result = FFmpeg.atPath()
            .addInput("input.mp4")
            .setStartTime("00:00:10")
            .setDuration("00:00:20")
            .addOutput("clip.mp4")
            .execute();
        System.out.println("剪辑完成:" + result);
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14

使用这些库可以避免手动解析命令行参数,简化开发过程,同时也便于集成到 Spring Boot 等现代 Java 框架中。

# 3.3 Maven 依赖版本对应

javacv 和 ffmpeg 的版本对应关系:

  • Bytedeco - Download (opens new window)

版本不对应可能会抛出异常:

Could not initialize class org.bytedeco.ffmpeg.global.avutil
1

# 4. 实践案例:构建视频剪辑服务

以一个简单的案例说明如何在 Spring Boot 中整合 FFmpeg 进行视频剪辑。思路如下:

  1. 接收前端上传的原始视频文件。
  2. 通过 FFmpeg 剪辑出指定时段的片段。
  3. 将剪辑好的片段返回给前端或保存到存储服务器。

核心代码示例:

@RestController
@RequestMapping("/video")
public class VideoController {

    @PostMapping("/clip")
    public ResponseEntity<String> createClip(@RequestParam("start") String startTime,
                                               @RequestParam("duration") String duration,
                                               @RequestParam("inputFile") MultipartFile inputFile) throws Exception {
        // 保存上传的文件到临时目录
        File tempInput = File.createTempFile("input", ".mp4");
        inputFile.transferTo(tempInput);
        File tempOutput = File.createTempFile("clip", ".mp4");

        // 构造 FFmpeg 命令
        String command = String.format("ffmpeg -ss %s -i %s -t %s -c copy %s",
                startTime,
                tempInput.getAbsolutePath(),
                duration,
                tempOutput.getAbsolutePath());
        ProcessBuilder builder = new ProcessBuilder("bash", "-c", command); // Linux/macOS
        Process process = builder.start();
        process.waitFor();

        // 此处可将 tempOutput 返回给客户端或进一步处理
        return ResponseEntity.ok("剪辑完成,输出文件:" + tempOutput.getAbsolutePath());
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27

你可以将以上代码扩展为完整的 REST API 服务,处理异常、日志记录及并发任务等。

# 5. 小结与扩展学习

本文介绍了 FFmpeg 的基本原理和常用命令,同时讨论了如何在 Java 中通过命令行调用和封装库(如 Jaffree、JavaCV)来集成 FFmpeg。

以下几点是你在学习过程中可以进一步探讨的内容:

  • FFmpeg 高级参数:例如码率控制、CRF 参数、预设(preset)和复杂滤镜(如 overlay、drawtext 等)。
  • 实时流处理:如何利用 FFmpeg 实现 RTSP 流转换和实时转码。
  • 错误处理与日志收集:在调用 FFmpeg 时如何捕获错误输出,保证服务稳定性。

通过理论学习与实践结合,相信你能快速掌握 FFmpeg 的使用,为你的 Java 项目添加强大的多媒体处理能力。

# 6. FFmpeg 安装与配置

  • 下载地址:Download FFmpeg (opens new window)
  • 教程参考:FFmpeg 超级详细安装与配置教程(Windows 系统)_windows安装ffmpeg-CSDN博客 (opens new window)

# 学习参考

  • 官方文档(英文):http://ffmpeg.org/ffmpeg.html (opens new window)
上次更新: 2025/2/8 18:02:22
Elasticsearch之HTTP篇
ffmpeg参数篇

← Elasticsearch之HTTP篇 ffmpeg参数篇→

Theme by Vdoing | Copyright © 2023-2025 沉梦听雨 | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式