FFmpeg简单使用

539 阅读6分钟

简单记录下FFmpeg的使用

一、Windows下载

下载地址:www.ffmpeg.org/download.ht…

根据当前所使用的系统选择下载。

二、环境变量配置

1、下载完成之后,解压到你选定的目录下。

2、然后配置环境变量

(1)、获取bin目录的路径:D:\dev\ffmpeg\bin

(2)、将bin目录的路径添加到系统变量path里面。

(系统开始菜单--右击计算机--点击属性--选中高级系统设置--选择高级--选择环境变量设置)

三、使用命令行窗口检查是都配置成功

命令:ffmpeg -version 查看当前ffmpeg版本

命令:ffmpeg -h 可打印ffmpeg打印文档

...

四、常用的命令

1、主要参数:

(1)、-i 设定输入流

(2)、-f 设定输出格式

(3)、-ss 开始时间

2、视频参数

(1)、-r 设定帧率,默认值为25

(2)、-s 设定画面的宽与高

(3)、-aspect 设定画面比例

(4)、-vn 不处理视频

(5)、vcodec 设定视频编码器,未设定时则使用与输入流相同的编解码器

3、音频参数

(1)、-ac 设定声音的Channel数

(2)、-acodec 设定音频编码器,未设定时则使用与输入流相同的编解码器

(3)、-an 不处理音频

五、简单实战

1、格式转换

ffmpeg -i .\我叫王月半.mp4 .\我叫王月半.mkv

执行命令后videos文件夹下生成了mkv格式的视频文件。

(想要换成其他格式的,只需要把输出格式改掉就行。mp4、flv、mkv、avi、

3gp、mov、swf、wmv、mpg等)

2、提取纯视频

ffmpeg -i .\我叫王月半.mp4 -vcodec copy -an .\我叫王月半_纯视频.mp4

-an 不处理音频

执行命令后,videos文件夹中就多了一个不带音频的视频文件。

3、提取纯音频

提取文件中的音频

ffmpeg -i .\我叫王月半.mp4 -vcodec copy -vn .\我叫王月半_纯音频.aac

默认pm4文件中的音频是aac编码,将任何格式的视频转换为最常见的aac

ffmpeg -i .\我叫王月半.mp4 -vcodec aac -vn .\我叫王月半_纯音频.aac

-vn 不处理视频

执行ffmpeg -i .\我叫王月半.mp4 -vcodec copy -vn .\我叫王月半_纯音频.aac命令后videos文件夹下生成了aac格式的音频文件。

4、剪切视频

ffmpeg -i .\我叫王月半.mp4 -vcodec copy -acodec copy -ss 00:00:02 -t 00:00:05 .\我叫王月半_剪切5s.mp4

参数详解:

-i .\我叫王月半.mp4 表示输入源文件

-vcodec copy 表示和原视频使用一样的视频编解码器

-acodec copy 表示和原视频使用一样的音频编解码器

-ss 00:00:02 表示从第2秒开始截取(开始点)

-t 00:00:05 表示一共截取5秒(截取时长)

-to 00:00:05 表示截取到5秒(结束点)

执行命令后videos文件夹下生成了文件:我叫王月半_剪切5s.mp4。

注释:上面的剪切方式可能比较慢,

先确定开始点,再解码,会快一些。就是解码会丢弃掉开始点的之前的结果

ffmpeg -ss 00:00:01 -i .\我叫王月半.mp4 -t 3 -c:v copy -c:a copy .\我叫王月半_剪切5s_2.mp4

备注一个问题:由于关键帧的存在,ffmpeg在剪切时无法做到时间上绝对准确,因为在视频编码中,关键帧(I帧)无法和跟随它的B帧(双向差别帧,记录本帧与前后帧差别的帧)P帧(差别帧,没有完成的画面,只有与前一帧差别的数据)分隔开。否则就需要帧内编码,会让视频体积变大。所以切割的位置在两个关键帧中间,ffmpeg会向前或后切割,所以时间上做不到绝对准确。

5、码率控制

码率控制对于在线视频比较重要,因为在线视频需要考虑能为其提供的带宽。在压缩视频时,经常需要控制码率。

码率就是文件大小除以文件时长 ---> bitrate = file size / duration

比如说一个大小为12M,时长为1分钟的视频,那么码率就是:

bitrate = 12 * 1024 * 1024 * 8 bit / 60s = 1678Kbps

一般的音频码率是比较固定的几种,比如说128Kbps

那么视频就是:1678Kbps - 128Kbps = 1550Kbps

ffmpg控制码率有3种选择:-minrate -b:v -maxrate

-b:v 主要是控制平均码率。

-bufsize 用于设置码率控制缓冲器的大小,设置的好处是,让整体的码率更趋近于希望的值,减少波动。

-maxrate 在线视频有时候,希望码率波动,不要超过一个阈值

ffmpeg -i input.mp4 -b:v 2000k -bufsize 2000k -maxrate 2500k output.mp4``6、视频编码格式转换``ffmpeg -i input.mp4 -vcodec h264 output.mp4``7、视频分辨率修改``ffmpeg -i input.mp4 -vf scale=960:540 output_改变帧宽度.mp4``8、添加logo``ffmpeg -i input.mp4 -i logo.png -filter_complex overlay output_add_logo.mp4 -y``-y 表示假如已存在输出文件的话则覆盖``9、抓取视频帧存为图片``ffmpeg -i input.mp4 -r 1 -q:v 2 -f image2 pic-%03d.jpeg``参数解析:``-i 表示输入源文件``-r 表示每一秒几帧``-q:v 表示存储的图片质量``-f 表示指定文件格式``执行命令:ffmpeg -i .\我叫王月半.mp4 -r 1 -q:v 2 -f image2 pic-%03d.jpeg``![](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/7d88dac9c2c34e49b294cbd22ae4c215~tplv-k3u1fbpfcp-zoom-1.image)``生成N多jpeg格式的图片

10、视频帧生成gif动图

ffmpeg -i .\我叫王月半.mp4 -vframes 30 -y -f gif .\我叫王月半_前30帧.gif``执行命令之后生成gif动图``![](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/99d48d8a0d0843de9bd9a644ab1e979a~tplv-k3u1fbpfcp-zoom-1.image)

11、使用多张图片合成gif动图

ffmpeg -f image2 -framerate 5 -i .\dota_%03d.png .\dota.gif``![](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/60740fce787948bf8235ffed372a706f~tplv-k3u1fbpfcp-zoom-1.image)

12、多张图片合成视频

ffmpeg -framerate 1/2 -i .\00%1d.JPG -i .\audio.aac -c:v libx264 -r 30 -pix_fmt yuv420p out.mp4

参数详解

通过在-i之后设置-r或使用fps过滤器,可以输出视频流的帧速率。如果希望输入和输出帧速率相同,则只需声明输入-framerate,输出将继承相同的值(这意味着您可以省略-r)。

通过为输入和输出使用单独的帧速率,您可以控制显示每个输入的持续时间,并告诉ffmpeg输出文件所需的帧速率。如果您的播放器无法处理非标准的帧速率,这将很有用。如果输入-framerate低于输出-r,则ffmpeg将复制帧以达到所需的输出帧速率。如果输入-framerate高于输出-r,则ffmpeg将丢弃帧以达到所需的输出帧速率。

在此示例中,每个图像的持续时间为5秒(每秒1/5帧的倒数)。通过相应地复制帧,视频流将具有30 fps的帧速率。每张图片播放了60帧。