视频处理工具ffmpeg使用

简介: 开源视频处理工具使用实践

下载

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

https://www.gyan.dev/ffmpeg/builds/#release-builds

然后按照下图点击,找到Release部分下载一个即可。

安装

所谓安装就是解压并配置“path”环境变量

将安装包解压至任意目录,比如我这里是D:\Program\ffmpeg-5.0.1-full_build

按照以下顺序点击:“此电脑(右键)——属性——高级系统设置——环境变量”

然后把ffmpeg.exe所在路径,即D:\Program\ffmpeg-5.0.1-full_build\bin添加到Path中,之后一路确定即可。

验证安装:

打开cmd,输入ffmpeg,出现正常的程序说明,就表明安装成功了

cms.png

使用

官方使用说明: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

1

-i:指定输入

-y:输出如果重名直接覆盖

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

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

1

-vcodec copy:拷贝视频

-acodec copy:拷贝音频

改变帧率

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

1

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

改变编码

比如使用h265编码

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

1

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

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

控制转码质量

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

1

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

1

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

1

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

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

时序裁剪

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

1

-ss:指定截取的起始时间点,格式是hh:mm:ss

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

空间裁剪

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

1

-vf 表示设置video相关的filters

crop后面的参数格式是width:height: x:y。width和height是输出视频的宽高;x,y是输出视频的左上顶点的坐标。

旋转视频

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

1

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

缩放视频

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

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

1

2

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

抽帧

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

1

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

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

1

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

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

1

-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

1

2

3

提取IPB帧,其中-vsync vfr选项可以删除掉重复帧,不然提取出来的结果有大量重复图片。

但还是注意,这种情况下ffmpeg抽取的帧仍然是从1开始连续计数,所以就无法知道单独抽取出来的IPB帧真实的帧号序列。可以使用下面命令打印帧类型,然后手动重命名。

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

1

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

[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

1

2

-an:这个选项用于去掉音频(disable audio),剩下的就是单独视频了。

为了使提取的视频与源视频一样,可加上-vcodec copy选项

单独提取音频

ffmpeg -i input.mp4 -vn -y audio.mp3

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

1

2

-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

1

2

设置两个输入一个输出即可,两个输入分别是视频和音频。如果不想重新对输入做编码,那么使用-vcodec copy -acodec copy选项。

最终输出视频的长度是两个文件较长者,比如mp3长于mp4,那么mp4播放结束后固定在最后一帧,继续播mp3

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

1

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

替换源视频中的音频

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

1

-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

1

2

3

图片合成视频

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

1

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

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

1

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

-r放在前面的话既指定图片输入的帧率,也指定视频输出的帧率。

-r放在后面的话仅指定视频输出的帧率。

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

1

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

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

1

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

视频更换预览封面

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

1

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

图片+声音,生成视频

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

1

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

转gif

ffmpeg -i input.mp4 -y output.gif

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

1

2

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

改变色彩格式(pix_fmt)

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

1

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

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

ffmpeg -h encoder=libx264

1

打印的信息有点长,从信息中可以扒拉出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工具下载m3u8类型的视频到本地
使用ffmpeg工具下载m3u8类型的视频到本地
1077 0
使用ffmpeg工具下载m3u8类型的视频到本地
|
3月前
|
Linux 开发工具 Android开发
FFmpeg开发笔记(五十三)移动端的国产直播录制工具EasyPusher
EasyPusher是一款国产RTSP直播录制推流客户端工具,支持Windows、Linux、Android及iOS等系统。尽管其GitHub仓库(安卓版:https://github.com/EasyDarwin/EasyPusher-Android)已多年未更新,但通过一系列改造,如升级SDK版本、迁移到AndroidX、指定本地NDK版本及更新Gradle版本等,仍可在最新Android Studio上运行。以下是针对Android Studio Dolphin版本的具体改造步骤。
65 3
FFmpeg开发笔记(五十三)移动端的国产直播录制工具EasyPusher
|
3月前
|
编解码 NoSQL Java
|
3月前
|
Python Windows
moviepy:基于 ffmpeg 的视频处理模块
moviepy:基于 ffmpeg 的视频处理模块
56 0
|
算法 内存技术
ffmpeg开课工具准备
ffmpeg开课工具准备
51 0
|
编解码 Linux 数据安全/隐私保护
深入浅出FFmpeg:一款强大的多媒体处理工具
深入浅出FFmpeg:一款强大的多媒体处理工具
174 0
|
存储 内存技术
[✔️]FFMpeg视频处理
[✔️]FFMpeg视频处理
105 0
|
编解码 网络协议 Linux
多媒体处理工具 FFmpeg 工具集
FFmpeg在Linux平台下开发,但它同样也可以在其它操作系统环境中编译运行,包括Windows、Mac OS X等。
|
编解码 vr&ar 计算机视觉
ffmpeg工具的简单使用
ffmpeg工具的使用
170 0
|
编解码 vr&ar 计算机视觉
ffmpeg工具的简单命令
ffmpeg工具的使用
271 0