ffmpeg安装及使用

article/2025/9/26 4:51:44

下载

下载地址:https://ffmpeg.org/download.html

然后按照下图点击,找到Release部分下载一个即可。
在这里插入图片描述
在这里插入图片描述

安装

所谓安装就是解压并配置“path”环境变量
将安装包解压至任意目录,比如我这里是D:\Program\ffmpeg-5.0.1-full_build
按照以下顺序点击:“此电脑(右键)——属性——高级系统设置——环境变量”
然后把ffmpeg.exe所在路径,即D:\Program\ffmpeg-5.0.1-full_build\bin添加到Path中,之后一路确定即可。
在这里插入图片描述
在这里插入图片描述

验证安装:
打开cmd,输入ffmpeg,出现正常的程序说明,就表明安装成功了
在这里插入图片描述

使用

官方使用说明:https://ffmpeg.org/ffmpeg.html

查看视频信息

ffmpeg -i input.mp4

显示如下:
在这里插入图片描述
从上面可以得到如下信息:

视频编码:h264
色彩格式:yuvj420p
色域范围:bt709
分辨率:1080x1920(width x height)
视频码率:14309 kbps
帧率:30 fps
音频编码:aac
音频码率:115 kbps
音频采样率:44100 Hz

最简单用法

ffmpeg -i input.mp4 -y output.avi

-i:指定输入
-y:输出如果重名直接覆盖

以拷贝的形式转格式,不重新编码,所以速度很快

ffmpeg -i input.mp4 -vcodec copy -acodec copy output.avi

-vcodec copy:拷贝视频
-acodec copy:拷贝音频

改变帧率

ffmpeg -i input.mp4 -r 10 -y output.mp4

-r 10:将输出帧率改为10 fps

改变编码

比如使用h265编码

ffmpeg -i input.mp4 -vcodec libx265 -y output.mp4

之后再查看视频信息可以看到(hevc = h265):

Stream #0:00x1: Video: hevc (Main) (hev1 / 0x31766568)

控制转码质量

ffmpeg -i input.mp4 -crf 35 -y output.mp4

ffmpeg -i input.mp4 -qp 30 -y output.mp4

QP(Quantization Parameters)和CRF(Constant Rate Factor)都是数值越小画质越好,数值越大画质越差。

QP在整个编码中使用相同的量化参数。

而CRF则具备自适应调节QP的能力,在画面运动比较强的时候使用高QP,在画面运动比较小的时候使用低QP。因为当画面运动比较强的时候,人的注意力常常不会被画质所吸引,所以QP大一些,也就是说画质差一些,不会造成太大的主观体验上的影响;反之当画面运动很小时,人的注意力有充分的空闲去注意画质问题,此时需要QP小一些,画质好一些,以避免带来糟糕的主观体验。另外与CRF名字呼应的一点,画面运动强时,视频片段倾向于有比较高的码率,使用大的QP有助于降低码率;画面运动小时,视频片段倾向于有比较低的码率,使用小QP可以提升一些码率,所以整体而言CRF会起到稳定码率的作用。

一般来说,使用CRF的情况多于QP,如果不是对QP有特定需求,那么首选CRF模式。在几乎相同的视觉效果的情况下,CRF一般比QP能节省一些码率。

关于CRF的取值范围和默认值可参考如下:
在这里插入图片描述

QP在libx264情况下取值范围也是0-51。

控制输出码率

ffmpeg -i input.mp4 -b:v 5M -y c.mp4

其中关键性的参数是-b:v 5M,指输出码率限制在5M bps。

但请注意,这个模式只是控制视频最终的码率,并不意味着视频中码率一直保持固定值,事实上在这个模式下,视频码率变化反而会有一些不受控,有时(特别是每个转场后clip的初始一些帧)会特别低。

时序裁剪

ffmpeg -i input.mp4 -ss 0:0:5 -t 0:0:4 -y output.mp4

-ss:指定截取的起始时间点,格式是hh:mm:ss
-t:截取的持续时间(duration),格式也是hh:mm:ss;或者简单写一个数字,单位是秒。

空间裁剪

ffmpeg -i input.mp4 -vf crop=500:1000:0:0 -y output.mp4

-vf 表示设置video相关的filters
crop后面的参数格式是width:height: x:y。width和height是输出视频的宽高;x,y是输出视频的左上顶点的坐标。

旋转视频

ffmpeg -i input.mp4 -vf rotate=PI/4 -y output.mp4

rotate:以视频中心为旋转点,顺时针旋转视频,视频原本的宽高保持不变,所以旋转后视频会有内容缺失以及黑边。

缩放视频

ffmpeg -i input.mp4 -vf scale=360:540 -y output.mp4
ffmpeg -i input.mp4 -vf scale=360:-1-y output.mp4

scale:格式是 width:height,其中一项可以设置成-1,此时会根据另一条边的比例自动计算。

抽帧

ffmpeg -i input.mp4 .\temp\frame_%3d.png

帧号从1开始计数,路径必须已经存在。

ffmpeg -i input.mp4 -r 1 .\temp\frame_%3d.png

-r 1:每秒抽取1帧,帧号仍然从1开始连续计数。(第一帧看起来似乎有点重复)

ffmpeg -i input.mp4 -vframes 10 .\temp\frame_%3d.png

-vframes 10:指定抽帧数量,总共抽10帧。

ffmpeg -i input.mp4 -vf select=eq(pict_type\,I) -vsync vfr .\temp2\frame_%3d.png
ffmpeg -i input.mp4 -vf select=eq(pict_type\,P) -vsync vfr .\temp2\frame_%3d.png
ffmpeg -i input.mp4 -vf select=eq(pict_type\,B) -vsync vfr .\temp2\frame_%3d.png

提取IPB帧,其中-vsync vfr选项可以删除掉重复帧,不然提取出来的结果有大量重复图片。
但还是注意,这种情况下ffmpeg抽取的帧仍然是从1开始连续计数,所以就无法知道单独抽取出来的IPB帧真实的帧号序列。可以使用下面命令打印帧类型,然后手动重命名。

ffprobe -i input.mp4 -select_streams v -show_entries frame=pict_type

上述命令打印结果如下,想要把帧号对应起来,需要比较多的手动操作:

[FRAME]
pict_type=I
[SIDE_DATA]
[/SIDE_DATA]
[/FRAME]
[FRAME]
pict_type=B
[/FRAME]
[FRAME]
pict_type=P
[/FRAME]
[FRAME]
pict_type=B
[/FRAME]

IPB帧含义简介:

  • I帧:表示关键帧,是最完整的帧画面,一般视频封面都选择I帧。
  • P帧:单预测帧,利用之前的I帧或P帧,采用运动预测的方式进行帧间预测编码。
  • B帧:双向预测帧,利用双向帧进行预测编码。

单独提取视频

ffmpeg -i input.mp4 -an -y video.mp4
ffmpeg -i input.mp4 -an -vcodec copy -y video.mp4

-an:这个选项用于去掉音频(disable audio),剩下的就是单独视频了。
为了使提取的视频与源视频一样,可加上-vcodec copy选项

单独提取音频

ffmpeg -i input.mp4 -vn -y audio.mp3
ffmpeg -i input.mp4 -vn -acodec copy -y audio.aac

-vn:这个选项用于去掉视频(disable video),剩下的就是单独音频。
另注意-acodec copy选项只能用于.aac格式,不能用于mp3格式。

合并音视频

ffmpeg -i video.mp4 -i audio.mp3 -y output.mp4
ffmpeg -i video.mp4 -i audio.mp3 -vcodec copy -acodec copy -y output.mp4

设置两个输入一个输出即可,两个输入分别是视频和音频。如果不想重新对输入做编码,那么使用-vcodec copy -acodec copy选项。
最终输出视频的长度是两个文件较长者,比如mp3长于mp4,那么mp4播放结束后固定在最后一帧,继续播mp3

ffmpeg -i video.mp4 -i audio.mp3 -shortest -y output.mp4

-shortest:以音频和视频文件中较短的作为输出长度。

替换源视频中的音频

ffmpeg -i input.mp4 -i audio.mp3 -map 0:v:0 -map 1:a:0 -y output.mp4

-map 0:v:0将第一个(索引0)视频流从输入映射到输出中的第一个(索引0)视频流。
-map 1:a:0将第二个(索引1)音频流从输入映射到输出中的第一个(索引0)音频流。

合并多段视频

mpeg格式文件可以直接合并,但是不通用。
一般可以选择将视频转化为 ts 流,然后再合并。

ffmpeg -i input.mp4 -vcodec copy -acodec copy -vbsf h264_mp4toannexb 1.ts
ffmpeg -i input2.mp4 -vcodec copy -acodec copy -vbsf h264_mp4toannexb 2.ts
ffmpeg -i "concat:1.ts|2.ts" -vcodec copy -acodec copy -absf aac_adtstoasc -y output.mp4

图片合成视频

ffmpeg -i .\temp\frame_%3d.png -y output.mp4

上面是最简单的命令,默认帧率是25,一般需要设置个帧率。

ffmpeg -r 30 -i .\temp\frame_%3d.png -y output.mp4

设置帧率的话,把-r 30放在-i xxx前面或者后面代表的含义不一样:

  • -r放在前面的话既指定图片输入的帧率,也指定视频输出的帧率。
  • -r放在后面的话仅指定视频输出的帧率。
ffmpeg -r 30 -i .\temp\frame_%3d.png -r 60 -y output.mp4

比如,如果使用300张图片,使用上述命令合成视频,那么图片以30fps送入,视频以60fps输出,所以最后结果是60fps * 10s的视频,视频包含600帧。至于多出来的帧是重复帧还是插帧得来的,不是太清楚。

ffmpeg -r 30 -i .\temp\frame_%3d.png -i audio.aac -y output.mp4

可以进一步使用上面命令把音频也加上。

视频更换预览封面

ffmpeg -i input.mp4 -i cover.png -map 0 -map 1 -c copy -disposition:v:1 attached_pic -y output.mp4

用上面命令可以把视频的预览封面改成cover.png

图片+声音,生成视频

ffmpeg -loop 1 -i image.png -i audio.aac -shortest -y output.mp4

-loop 1表示图片无限循环,-shortest表示视频持续到音频结束。

转gif

ffmpeg -i input.mp4 -y output.gif
ffmpeg -i input.mp4 -s 540:960 -y output.gif

直接改变后缀就可以实现输出gif的目的,-s 540:960可以改输出分辨率,格式是W:H或者WxH

改变色彩格式(pix_fmt)

ffmpeg -i input.mp4 -pix_fmt yuv422p -y output.mp4

有时候Windows下合成的视频放到Mac上不能播放,可能就是受色彩格式影响,改变一下色彩格式就能解决。

查看每种编码器支持的色彩格式,可以使用如下命令:

ffmpeg -h encoder=libx264

打印的信息有点长,从信息中可以扒拉出libx264支持的色彩格式:

Supported pixel formats: yuv420p yuvj420p yuv422p yuvj422p yuv444p yuvj444p nv12 nv16 nv21 yuv420p10le yuv422p10le yuv444p10le nv20le gray gray10le

libx265:

Supported pixel formats: yuv420p yuvj420p yuv422p yuvj422p yuv444p yuvj444p gbrp yuv420p10le yuv422p10le yuv444p10le gbrp10le yuv420p12le yuv422p12le yuv444p12le gbrp12le gray gray10le gray12le

参考资料:

FFmpeg 视频处理入门教程
FFmpeg的安装与基础使用教程
CRF Guide (Constant Rate Factor in x264, x265 and libvpx)
Understanding Rate Control Modes (x264, x265, vpx)
FFmpeg VBR Settings
H.264 Video Encoding Guide
you shouldn’t use ABR ever.


http://chatgpt.dhexx.cn/article/GVbZNBuc.shtml

相关文章

ffmpeg详细安装教程,亲测有效!

这两天整理好用的录屏软件,发现了Captura这个软件,软件本身的安装很简单,但由于Captura需要依赖ffmpeg(一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源计算机程序),而ffmpeg在安…

ffmpeg的下载及安装

最近在处理一些音频数据,ffmpeg是一款非常好用处理音视频的工具包。那什么是ffmpeg呢?FFmpeg是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源计算机程序,可以结合Java开发一些处理视频音频的功能。 1.ffmpeg下载…

如何安装ffmpeg,详细安装教程,亲测有效

今天在下载网上视频的时候,发现下载的是ts文件 想要转换mp4 文件需要安装ffmpeg 网上找了很多方法,整理出ffmpeg的安装方法,详细讲解如下。 1、下载ffmpeg 到ffmpeg官网https://ffmpeg.org/download.html,按照箭头点击下载安装包 …

C语言 不使用strcpy 函数实现字符串复制功能

Ⅰ )字符串复制函数 字符串复制是字符串操作中比较常用的操作之一。C语言库函数中提供的字符串复制函数是:strcpy函数。该函数的功能为:把源字符数组中的字符串复制到目的字符数组中,字符串结束标志“\0”也一同复制。下面实例为通…

用c语言实现字符串复制

1.题目来源 作者: C课程组 单位: 浙江大学 时间限制: 400 ms 内存限制: 64 MB 代码长度限制: 16 KB 2.问题简述 本题要求编写函数,将输入字符串t中从第m个字符开始的全部字符复制到字符串s中。 函数接口定义: void strmcpy( char *t, int m, ch…

多种方式实现字符串的复制

用字符数组名做函数的参数 #include<stdio.h>//用函数调用实现字符串的复制 int main() { void fgo(char c[],char d[]);char a[]"听我说谢谢你~",b[]"你要结婚啦~";printf("a%s\n",a);printf("b%s\n",b);printf("将a复制…

复制字符串的三种方法

1.通过指针实现 2.通过自定义函数实现 3.通过调用字符串处理库中的复制函数实现 注意字符串结尾的\0

win10 mysql8 my.ini配置文件

郑重说明 网上很多文章写win10系统下的mysql8版本的配置文件位置在哪里&#xff0c;以及如何安装mysql&#xff0c;等等。这些要么将的不够清晰&#xff0c;要么画蛇添足。经过繁琐的查询和测试&#xff0c;终于搞定&#xff0c;现在记录下来&#xff0c;希望能够帮助到诸位。…

在CentOS7下添加MySQL用户并设置相应权限

2019独角兽企业重金招聘Python工程师标准>>> 1.进入mysql命令行&#xff0c;输入root及密码 [rootlocalhost ~]# mysql -u root -p Enter password: Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 19 Server version: 5…

MySQL增加默认值

MySQL里面的表同一列里要填的若大多是同一个值&#xff0c;这时候就可以设置默认值了。 方便快捷的填充。 例如 存在jxgl里的students表性别列要填的大多是&#xff1a;男。 则可以使用ALTER命令修改。 详细命令如下。 一个文字占两个空格&#xff0c;所以char()括号里面的…

mysql8设置sql_mode

原文 mysql8报错&#xff0c; 在mysql配置文件下设置 sql_mode‘NO_AUTO_VALUE_ON_ZERO,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION,PIPES_AS_CONCAT,ANSI_QUOTES’ 在mysqlld下添加sql-mode

MySQL的设置

一、MySQL数据库服务的启动和停止 MySQL软件的服务器端必须先启动&#xff0c;客户端才可以连接和使用数据库。 图形化方式 计算机&#xff08;右键鼠标&#xff09;----> 管理&#xff08;点击&#xff09;----> 服务和应用程序&#xff08;点击&#xff09;---->…

MySQL中添加或插入语句(Insert)的几种使用方式

1.各大培训机构&#xff0c;价格10万的视频 Java架构师视频免费送 2.各种电子书籍经典Java书籍免费送 3.关注下方我的公众号进行免费获取 MySQL中添加或插入语句(Insert)的几种使用方式 1.INSERT 简写方式插入数据(不推荐) 1.先看一下表中有那些数据 2.使用Inset into 表名 va…

mysql添加备注信息

前言 这连天有人问我一些mysql的备注信息&#xff0c;不得已还是写一遍博客吧 1、创建表的时候&#xff0c;添加表名备注和字段备注 CREATE TABLE healerjean_comment (id bigint(20) NOT NULL AUTO_INCREMENT,name varchar(32) NOT NULL COMMENT 名字备注,email varchar(64)…

关于 Unable to attach to 32-bit process running under WOW64的错误

关于 Unable to attach to 32-bit process running under WOW64的错误 今天在使用IDEA编译的程序的时候&#xff0c;使用jinfo 命令查看的时候出现 然后初步判断自己JDK安装错误&#xff0c;但是后面查看自己的JDK版本没错&#xff0c;然后判断是不是编译的时候用的32位的JDK&a…

Unable to attach to 32-bit process running under WOW64

最近在使用jps及jstack指令时&#xff0c;遇到一个问题。 文章目录 问题描述1. 使用eclipse启动一个死锁的进程2. 打开cmd3. 执行指令 分析过程1. 如何查看进程是多少位的&#xff1f; 修改方法 问题描述 1. 使用eclipse启动一个死锁的进程 public class DeadThread {public…

调试运行在Wow64子系统下的程序----x64版windbg调试win32程序

大家有没有遇到过这种情况&#xff1a;程序崩溃了&#xff0c;windbg分析线程堆栈时&#xff0c;输出了一堆乱七八糟的调用栈。更烦心的是&#xff0c;这堆调用栈中根本找不到跟自己程序相关的信息。来看一个类似的场景&#xff1a;运行C:\Windows\SysWOW64\calc.exe (win32版的…

谈谈Windows Wow64

本文是《深入理解Windows操作系统 (第六版) 》关于64位Windows操心系统有关Wow64部分的读书笔记&#xff0c;因为之前很少有接触到关于Wow64的部分&#xff0c;记录一下。 Wow64是允许在64位Windows上执行32位x86应用程序的软件。它的实现方式是一组用户模式dll&#xff0c;外…

Windows WOW64 nativeapi 逆向详解,32程序兼容剖析

前言 windows有很多核心的原生api&#xff0c;其中包含sdk声明的和文档未声明的。主要由于ntdll.dll和win32u.dll(服务号0x1000-0x1FFF)导出。 WOW64 (Windows-on-Windows 64-bit)是一个Windows操作系统的子系统&#xff0c;用于模拟32位环境&#xff0c;使得32位执行程序在x64…

mysql版本wow64平台_WOW64最佳实现

WOW64简介 WOW64(Windows 32-bit On Windows 64-bit)是x64平台上运行win32应用程序的模拟器&#xff0c;它在系统层提供了中间层&#xff0c;将win32的系统调用转换成x64进行调用&#xff0c;并且将x64返回的结果转换成win32形式返回给win32程序。下图描述了win32程序如何在x64…