简单记录下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````生成N多jpeg格式的图片
10、视频帧生成gif动图
ffmpeg -i .\我叫王月半.mp4 -vframes 30 -y -f gif .\我叫王月半_前30帧.gif``执行命令之后生成gif动图``
11、使用多张图片合成gif动图
ffmpeg -f image2 -framerate 5 -i .\dota_%03d.png .\dota.gif``
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帧。