ffmpeg基础使用

一、下载安装

进入官网进行下载对应平台Download FFmpeg

下载完成后,在它的bin/目录下有三个文件:ffmpeg.exe ffplay ffprobe.exe 他们分别是:编解码器,播放器和音视频分析器。

需要把bin/目录添加至环境变量path中,否则cmd识别不到ffmpeg命令。

ffplay INPUT 可直接播放视频

ffprobe 是分析工具,例如查看一个视频的编码格式

ffprobe -hide_banner xxx.mov 可以精简查看一个视频的编码格式

这里主要介绍主角 ffmpeg 的使用(所有的操作都在cmd命令行中进行)

Linux 安装:

Nux存储库依赖于Epel软件存储库。如果您的系统启用EPEL存储库,请键入以下命令将其启用:

sudo yum install epel-release

接下来,导入Repository GPG密钥并通过安装rpm软件包启用Nux存储库:

sudo rpm -v –import http://li.nux.ro/download/nux/RPM-GPG-KEY-nux.ro

sudo rpm -Uvh http://li.nux.ro/download/nux/dextop/el7/x86_64/nux-dextop-release-0-5.el7.nux.noarch.rpm

开始安装:

sudo yum install ffmpeg ffmpeg-devel

检查看装是否成功:

ffmpeg -version

yum -y install wget
wget --no-check-certificate https://www.johnvansickle.com/ffmpeg/old-releases/ffmpeg-4.0.3-64bit-static.tar.xz
tar -xJf ffmpeg-4.0.3-64bit-static.tar.xz
cd ffmpeg-4.0.3-64bit-static
mv ffmpeg /usr/bin && mv ffprobe /usr/bin && mv qt-faststart /usr/bin && mv ffmpeg-10bit /usr/bin

二、视频的封装与编码

视频容器封装格式:

1
包含 mp4,mov,avi,webm,mkv 等等

一个视频包含视频,音频,字幕等,容器是以不同的方式和存储这些不同类型的数据。每种格式支持的视频,音频以及字幕的数量不同,所支持的视频编码格式也不同。

视频编码格式:

编码格式决定了视频内容的解码、压缩以及存储方式

常见的编码格式:H264、ProRes、DNXHD

编码只处理视频,封装是把视频,音频,字幕等再进行一次统一打包,最终形成完整的视频文件。

常用操作:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
查看ffmpeg所支持的所有容器封闭格式列表:ffmpeg -formats
D表示解封装,E表示支持的封装。
---------
查看mp4的封装格式的说明和参数选项:ffmpeg -h muxer=mp4
Muxer mp4下面可以看到常用后缀,文件媒体类型,默认音视频编码等
还有在使用ffmpeg时的一些参数选项
----------
不同的封装格式,对视频编码格式有所不同
MOV可以支持 h264、ProRes、NDXHD
MP4支持h264,但不支持ProRes和NDXHD
查看所有视频编码格式列表:ffmpeg -codecs
D表示支持解码操作
E表示支持编码操作
V表示支持视频的编解码操作
A表示音频编解码操作
S表示字幕格式的编解码操作
I表示帧内编码
L表示该编码格式属于有损压缩方式
S表示该编码格式属于无损压缩方式
1
2
3
4
一般视频转码过程:
Demuxer-->Decoder-->encoder-->muxer
解封装---->解码------>重新编码-->重新封装
如果原始文件与目标文件的视频编码一样,则可以省去中间解码、重新编码的大量计算过程。直接 Demuxer-->muxer即可。

三、视频转码

在ffmpeg进行视频转码时,都是使用类似的命令:

1
2
3
4
5
6
7
8
9
ffpmeg -i INPUT -c:v ENCODER1 OPTIONS1 -c:a ENCODER2 OPTIONS2 OUTPUT
------参数解释-------
INPUT 是输入文件
ENCODER1 表示视频编码器的名称
OPTIONS1 表示视频编码器参数和选项
ENCODER2 表示音频编码器的名称
OPTIONS2 表示音频编码器参数和选项
OUTPUT 表示输出文件名称
所有的转换,都遵循这个规律
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
H264转码
ffmpeg -i INPUT -c:v libx264 -c:a aac OUTPUT
**************
我们可以选用上面的OPTIONS来进行画质、码率、限制文件大小的调整
使用:ffmpeg -h encoder=libx264 查看H264编码的参数和选项
-crf表示恒定质量模式下的画质级别,数字越小,画质越好,但转码速度也越慢。一般是16到23之间。
ffmpeg -i INPUT -c:v libx264 -crf 18 -c:a aac -ab 320k OUTPUT
-ab 表示音频码率为320k
---------------------
ProRes转码
将一个H264转为ProRes格式
ffmpeg -i INPUT -c:v prores -profile 1 -c:a aac -ab 320k OUTPUT
prores 有多个子编码规格,需要使用 -profile来进行指定
可以用 ffmpeg -h encoder=prores_ks来查看参数说明
---------------------
DNXHD转码
ffmpeg -i INPUT -c:v dnxhd -profile dhxhr_lb -pix_fmt yuv422p -c:a aac -ab 320k OUTPUT
dnxhd 有多个子编码规格,需要使用 -profile来进行指定,dnxhd还需要指定像素格式
可以用 ffmpeg -h encoder=dnxhd 来查看参数说明
---------------------
CFHD编码
ffmpeg -i INPUT -c:v cfhd -quality high -c:a aac -ab 320k OUTPUT
可以用 ffmpeg -h encoder=cfhd 来查看参数说明

如果两个视频编码一样,则不需要经过复杂的解码编码过程

ffmpeg -i INPUT -c copy OUTPUT

-c copy 表示复制输入文件中的视频与音频,相当于 -c:v -c:a

四、音频转码

1
2
3
4
5
6
7
8
9
10
11
12
13
常用音频格式:mp3,aac,wav,flac
aac是常用的音频编码,通常与h264相匹配
wav在ffmpeg中称为PCM编码
flac是一种无损音频压缩编码
音频最重要的四要素:
ENCODER SAMPLE CHANNEL BITRATE
编码器、 采样率、 声道、 码率
采样率一般使用 44.1KHZ和48KHZ
声道:单声道,双声道,多声道
码率:码率越高,音质越好,但一般网站要求不超过320k
-------------------
音频转码基础命令格式:
ffmpeg -i INPUT -c:a ENCODER -ar SAMPLE -ac CHANNEL -ab BITRATE OUTPUT
1
2
3
4
5
6
7
8
WAV转MP3
ffmpeg -i INPUT -c:a libmp3lame -ar 44100 -ac 2 -ab 320k OUTPUT
--------------
WAV转AAC
ffmpeg -i INPUT -c:a aac -ar 44100 -ac 2 -ab 320k OUTPUT
--------------
FLAC转MP3
ffmpeg -i INPUT -c:a libmp3lame -ar 44100 -ac 2 -ab 320k OUTPUT

五、常用操作

1
2
3
4
5
6
7
8
9
10
11
12
截取视频片段:
ffmpeg -ss 00:00:00 -to 00:05:23 -i INPUT -y -f mp4 -vcodec copy -acodec copy -q:v 1 OUTPUT
从INPUT文件视频里,截取0时0分0秒到0时5分23秒的视频。输出生成OUTPUT
参数说明:
-ss 起始时间
-to 终止时间
-i 输入文件
-y 无需询问,直接覆盖输出文件(如果有的话)
-f 指定输出的视频格式
-vcodec 指定视频编码格式,copy 则保持不变
-acodec 指定音频编码格式, copy 则保持不变
-q:v q是质量,v是视频,v的取值范围是[1,35],1对应最佳质量
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
截取保存一张图片:
ffmpeg -ss 00:03:02 -i INPUT -vframes 1 output.jpg
参数说明:
-ss:起始时间
-vframes 1:取当前第一帧
---------------------------
每秒钟截取一张:
ffmpeg -i INPUT -vf fps=1 image_%d.jpg
参数说明:
-vf fps=1:表示frame per second截取一张
可以轻易写出每X秒一张的命令,比如每100秒一张:
ffmpeg -i INPUT -vf fps=1/100 image_%d.jpg
-----------------------------
保存关键帧:
ffmpeg -i INPUT -vf "select='eq(pict_type,PICT_TYPE_I)'" -vsync vfr image_%d.jpg
1
2
3
4
5
6
从视频中提取音频:
ffmpeg -i INPUT -f wav -ar 16000 OUTPUT
参数说明:
-f: 强制输出格式为wav
-ar:设置采样频率
ffmpeg -i INPUT -vn -acodec copy OUTPUT.aac

音频的转换查看 音频转码

1
2
3
4
去水印:
ffmpeg -i INPUT -vf delogo=x=163:y=116:w=148:h=45:show=0 OUTPUT
在x=163,y=116,宽=148,高=45的矩形范围内,生成滤镜水印。
(x,y)和(宽,高)就是水印的位置,如果要准确找到水印位置,可以先截取一张图片,找到(x,y)和(w,h)

rmvb转mp4

ffmpeg -i "02.rmvb" -vcodec libx264 -acodec copy "output.mp4"