【使用手册】之–FFmpeg一款免费开源的视频处理工具
#教程 #系统 #Windows #环境变量 #linux #工具 #ffmpeg #音影处理
1. 介绍
FFmpeg是一个免费的开源软件项目,由一套用于处理视频,音频和其他多媒体文件和流的库和程序组成。其核心是命令行工具本身,专为处理视频和音频文件而设计。它广泛用于格式转码、基本编辑(修剪和串联)、视频缩放、视频后期制作效果和标准合规性(SMPTE、ITU)。
FFmpeg还包括其他工具:,一个简单的媒体播放器和,一个命令行工具来显示媒体信息。其中包括libavcodec,一个被许多商业和免费软件产品使用的音频/视频编解码器库,libavformat(Lavf),音频/视频容器多路复用器和解复用器库,以及libavfilter,一个通过类似Gstreamer的滤波图来增强和编辑滤镜的库。
FFmpeg是许多其他软件项目工作流程的一部分,其库是VLC等软件媒体播放器的核心部分,并且已被包含在YouTube和Bilibili的核心处理中。包括用于许多音频和视频文件格式的编码器和解码器,使其对于常见和不常见媒体文件的转码非常有用。
官网:ffmpeg
官网手册:ffmpeg Documentation
GitHub:BtbN/FFmpeg-Builds · GitHub
2. 安装
下面以windows下为例:
下载地址:Release Latest · BtbN/FFmpeg-Builds · GitHub
通过GitHub找到对应版本下载。如:ffmpeg-master-latest-win64-gpl.zip,解压至C:\Program Files\
C:\Program Files\ffmpeg>tree
卷 系统 的文件夹 PATH 列表
卷序列号为 000E-B
C:.
├─bin
├─doc
└─presets
添加环境变量。可以参考:Windows使用之–如何添加环境变量
C:\Program Files\ffmpeg\bin
这样就可以在任意文件夹内启用cmd
或者powershell
运行ffmpeg
了
3. 用法
3.1. 视频转换
比如一个avi文件,想转为mp4,或者一个mp4想转为ts。
# 无损转换
ffmpeg -i input.flv -y -vcodec copy -acodec copy output.mp4
ffmpeg -i input.avi output.mp4
ffmpeg -i input.mp4 output.ts
3.2. 音频提取
# 提取原音质
ffmpeg -i input.flv -vn -codec copy output.m4a
ffmpeg -i input.mp4 -acodec copy -vn output.aac
# 上面的命令,默认mp4的audio codec是aac,如果不是,可以都转为最常见的aac。
ffmpeg -i input.mp4 -acodec aac -vn output.aac
3.3. 视频提取
ffmpeg -i input.mp4 -vcodec copy -an output.mp4
3.4. 视频剪切
# 下面的命令,可以从时间为00:00:15开始,截取5秒钟的视频。
ffmpeg -ss 00:00:15 -t 00:00:05 -i input.mp4 -vcodec copy -acodec copy output.mp4
# -ss表示开始切割的时间,-t表示要切多少。上面就是从15秒开始,切5秒钟出来。
3.5. 码率控制
码率控制对于在线视频比较重要。因为在线视频需要考虑其能提供的带宽。
码率计算bitrate = file size / duration
比如一个文件20.8M,时长1分钟,那么,码率就是:biterate = 20.8M bit/60s = 20.8_1024_1024*8 bit/60s= 2831Kbps
一般音频的码率只有固定几种,比如是128Kbps
那么,视频码率的就是video biterate = 2831Kbps -128Kbps = 2703Kbps
ffmpg控制码率有3种选择-minrate -b:v -maxrate
-b:v
主要是控制平均码率。
比如一个视频源的码率太高了,有10Mbps,文件太大,想把文件弄小一点,但是又不破坏分辨率。
ffmpeg -i input.mp4 -b:v 2000k output.mp4
上面把码率从原码率转成2Mbps码率,这样其实也间接让文件变小了。目测接近一半。
不过,ffmpeg官方wiki比较建议,设置b:v
时,同时加上 -bufsize
-bufsize
用于设置码率控制缓冲器的大小,设置的好处是,让整体的码率更趋近于希望的值,减少波动。(简单来说,比如1 2的平均值是1.5, 1.49 1.51 也是1.5, 当然是第二种比较好)
ffmpeg -i input.mp4 -b:v 2000k -bufsize 2000k output.mp4
-minrate -maxrate
就简单了,在线视频有时候,希望码率波动,不要超过一个阈值,可以设置maxrate。
ffmpeg -i input.mp4 -b:v 2000k -bufsize 2000k -maxrate 2500k output.mp4
3.6. 视频编码格式转换
比如一个视频的编码是MPEG4,想用H264编码,咋办?
ffmpeg -i input.mp4 -vcodec h264 output.mp4
# 相反也一样
ffmpeg -i input.mp4 -vcodec mpeg4 output.mp4
当然了,如果ffmpeg当时编译时,添加了外部的x265或者X264,那也可以用外部的编码器来编码。(不知道什么是X265,可以 Google一下,简单的说,就是她不包含在ffmpeg的源码里,是独立的一个开源代码,用于编码HEVC,ffmpeg编码时可以调用它。当然 了,ffmpeg自己也有编码器)
ffmpeg -i input.mp4 -c:v libx265 output.mp4
ffmpeg -i input.mp4 -c:v libx264 output.mp4
3.7. 只提取视频ES数据
ES–Elementary Streams (原始流)是直接从编码器出来的数据流,可以是编码过的视频数据流(H.264,MJPEG等),音频数据流(AAC),或其他编码数据流的统称。比如从封装的mp4中提取h264数据流
ffmpeg –i input.mp4 –vcodec copy –an –f m4v output.h264
3.8. 过滤器的使用
3.8.1. 分辨率缩小:
ffmpeg -i input.mp4 -vf scale=960:540 output.mp4
# 如果540不写,写成-1,即scale=960:-1, 那也是可以的,ffmpeg会通知缩放滤镜在输出时保持原始的宽高比。
3.8.2. 视频添加logo
# 比如,我有这么一个图片blog_logo.png想要贴到一个视频上,那可以用如下命令:
ffmpeg -i input.mp4 -i blog_logo.png -filter_complex overlay output.mp4
# 结果如下所示:
add logo left
# 放置位置:
# 右上角:
ffmpeg -i input.mp4 -i logo.png -filter_complex overlay=W-w output.mp4
# 左下角:
ffmpeg -i input.mp4 -i logo.png -filter_complex overlay=0:H-h output.mp4
# 右下角:
ffmpeg -i input.mp4 -i logo.png -filter_complex overlay=W-w:H-h output.mp4
3.8.3. 视频去掉的logo
ffmpeg -i input.mp4 -vf delogo=0:0:220:90:100:1 output.mp4
# -vf delogo=x:y:w:h:t:show
# x:y 离左上角的坐标
# w:h logo的宽和高
# t: 矩形边缘的厚度默认值4
# show:若设置为1有一个绿色的矩形,默认值0。
3.9. 视频截取图像
ffmpeg -i input.mp4 -r 1 -q:v 2 -f image2 pic-%03d.jpeg
# -r 表示每一秒几帧
# -q:v表示存储jpeg的图像质量,一般2是高质量。
# 如此,ffmpeg会把input.mp4,每隔一秒,存一张图片下来。假设有60s,那会有60张。
# 可以设置开始的时间,和你想要截取的时间。
ffmpeg -i input.mp4 -ss 00:00:20 -t 10 -r 1 -q:v 2 -f image2 pic-%03d.jpeg
# -ss 表示开始时间
# -t 表示共要多少时间。
# 如此,ffmpeg会从input.mp4的第20s时间开始,往下10s,即20~30s这10秒钟之间,每隔1s就抓一帧,总共会抓10帧。
3.10. 视频 gif 动图截取
# 可以设置开始的时间,和你想要截取的时间。
ffmpeg -i input.mp4 -r 15 -vf scale=512:-1 -ss 00:38:10 -to 00:38:20 out.gif
# -vf scale=512:-1 截取图像分辨率大小
# -to 截取结束时间,也可使用-t截取时长
3.11. 序列帧与视频的相互转换
# 把darkdoor.[001-100].jpg序列帧和001.mp3音频文件利用mpeg4编码方式合成视频文件darkdoor.avi:
ffmpeg -i 001.mp3 -i darkdoor.%3d.jpg -s 1024x768 -author fy -vcodec mpeg4 darkdoor.avi
# 还可以把视频文件导出成jpg序列帧:
ffmpeg -i bc-cinematic-en.avi example.%d.jpg
3.12. 音频处理
3.12.1. 多个音频合并
连接
ffmpeg -i "concat:1.mp3|2.mp3|3.mp3" -acodec copy output.mp3
# concat:1.mp3|2.mp3|3.mp3 # 代表着需要连接到一起的音频文件
# -acodec copy output.mp3 # 重新编码并复制到新文件中
混合
ffmpeg -i 11.mp3 -i 22.mp3 -filter_complex amix=inputs=2:duration=first:dropout_transition=2 -f mp3 remix.mp3
# -filter_complex # ffmpeg滤镜功能
# amix # 是混合多个音频到单个音频输出
# inputs=2 # 代表是2个音频文件,如果更多则代表对应数字
# duration # 确定最终输出文件的长度
# ongest(最长)|shortest(最短)|first(第一个文件)
# dropout_transition # 结束时音量重新规范化的过渡时间。默认值为 2 秒。
# -f mp3 # 输出文件格式
3.12.2. 音频截取
ffmpeg -i input.mp3 -vn -acodec copy -ss 00:00:00 -t 00:01:32 output.mp3
# -acodec copy output.mp3 # 重新编码并复制到新文件中
# -ss # 开始截取的时间点
# -t # 截取音频时间长度
3.12.3. 音频格式转换
# 直接转换,文件名内含空格等特殊字符需要,使用双引号
ffmpeg -i "in put.m4a" "out put.flac"
ffmpeg -i input.ape -acodec aac -ar 44100 -ac 2 -ab 16k -vol 100 -f mp3 output.mp3
# -acodec aac # 音频编码用AAC)
# -ar # 设置音频采样频率
# -ac # 设置音频通道数
# -ab # 设定声音比特率
# -vol # 设定音量(百分比)
评论区