简介

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集成、滤镜等等。在目前企业中也被广泛应用。只是作者在这里偷个懒~就不全部展示了。

FFmpeg的安装及简单使用的更多相关文章

  1. ffmpeg 下载安装和简单应用

    一.ffmpeg下载 先到http://ffmpeg.org/下载ffmpeg安装文件 二.ffmpeg安装 1.解压下载完的ffmpeg-20190319-f8075b2-win64-shared. ...

  2. ffmpeg下载安装和简单应用

    先介绍一下ffmpeg:FFmpeg是一个自由软件,可以运行音频和视频多种格式的录影.转换.流功能,包含了libavcodec —这是一个用于多个项目中音频和视频的解码器库,以及libavformat ...

  3. 视频处理工具FFmpeg的安装(windows/Linux)

    ♣FFmpeg是什么? ♣FFmpeg组成 ♣下载工具 ♣安装FFmpeg ♣应用到j2ee项目 前言:学习视频编码,一定要知道雷霄骅(leixiaohua1020)的专栏 ,伟大的程序员,26岁去世 ...

  4. (转)python requests的安装与简单运用

    requests是python的一个HTTP客户端库,跟urllib,urllib2类似,那为什么要用requests而不用urllib2呢?官方文档中是这样说明的: python的标准库urllib ...

  5. MongoDB在Windows下安装、Shell客户端的使用、Bson扩充的数据类型、MongoVUE可视化工具安装和简单使用、Robomongo可视化工具(2)

    一.Windows 下载安装 1.去http://www.mongodb.org/downloads下载,mongodb默认安装在C:\Program Files\MongoDB目录下,到F:\Off ...

  6. python requests的安装与简单运用

    requests是python的一个HTTP客户端库,跟urllib,urllib2类似,那为什么要用requests而不用urllib2呢?官方文档中是这样说明的: python的标准库urllib ...

  7. memcache的windows下的安装和简单使用

    原文:memcache的windows下的安装和简单使用 memcache是为了解决网站访问量大,数据库压力倍增的解决方案之一,由于其简单实用,很多站点现在都在使用memcache,但是memcach ...

  8. 【RabbitMQ】RabbitMQ在Windows的安装和简单的使用

    版本说明 使用当前版本:3.5.4 安装与启动 在官网上下载其Server二进制安装包,在Windows上的安装时简单的,与一般软件没什么区别. 安装前会提示你,还需要安装Erlang,并打开下载页面 ...

  9. Thrift的安装和简单演示样例

    本文仅仅是简单的解说Thrift开源框架的安装和简单使用演示样例.对于具体的解说,后面在进行阐述. Thrift简述                                           ...

  10. libmemcached安装及简单例子

    libmemcached安装及简单例子 1.下载安装libmemcached  $ wget http://launchpad.net/libmemcached/1.0/0.44/+download/ ...

随机推荐

  1. js技术之“input输入框转成下拉框,且保留可输入能力”

    一.jsp前端控件 <td class="form-label"> <label class="control-label">供货商货号 ...

  2. FastAPI-响应处理和配置

    前篇学习了关于请求参数相关的约束验证, Request 包括 路径参数 , 查询参数, 枚举参数, 文件参数, 类型验证, 多参数嵌套验证, 请求体嵌套验证, Cookie 和 Header 等, 了 ...

  3. Nginx No, Traefik Yes

    As we all know, Nginx is a very popular reverse proxy server. It is very stable and has a lot of fea ...

  4. CTP报单业务介绍

    程序化登录信息 客户如果需要调用API介入柜台进行程序化交易,登录时需要一些基本信息,如下: 1.BrokerID 简称期货编码,是在该期货公司在CTP系统上的编码,为四位数,例如海通期货是8000 ...

  5. C#之引用局部变量语法(ref local)

    ref Particle p = ref _particles[i]; 是 C# 的引用局部变量语法(ref local),它的作用是直接引用数组中某一项的内存地址,而不是创建该元素的副本.这在性能敏 ...

  6. L1-4、如何写出清晰有目标的 Prompt

    -- 写给想真正掌握 Prompt 写作逻辑的人 为什么要"清晰.有目标"? 在用 AI 时,很多人会碰到这些情况: 明明下达了指令,但 AI 总是理解错方向? 想让 AI 写一段 ...

  7. python代码片段

    输入分钟.秒,输出格式为:  hh:mm:ss 代码实现: import datetime def convert_to_hh_mm_ss(minutes, seconds): total_secon ...

  8. Linux 统计活跃线程和线程数

    摘要:使用Linux命令ps -eT动态查看进程中,以指定字符串打头的活跃线程和线程数. 动态查看进程的线程数及活跃线程数 实现方案   在Linux系统中,可以使用以下命令来动态查看进程中名字包含& ...

  9. 爬取西刺代理的IP与端口(一)

    0x01 简陋代码是,获取(.*?)的字符串 #coding:utf-8 from requests import * import re headers = { "accept" ...

  10. 重写IE的showModalDialog模态框以兼容现代浏览器

    背景 之前有个项目是 jsp 的,之前都是在 IE 浏览器上运行,现在要将这个项目做兼容性改造(信创),需要兼容谷歌.所以需要将项目中的公共弹框给改掉,而项目中模态框基本上都是用的 showModal ...