侧边栏壁纸
博主头像
v林羽博主等级

行动起来,活在当下

  • 累计撰写 172 篇文章
  • 累计创建 34 个标签
  • 累计收到 21 条评论

目 录CONTENT

文章目录

【使用手册】之--FFmpeg一款免费开源的视频处理工具

v林羽
2022-06-01 / 0 评论 / 0 点赞 / 411 阅读 / 9298 字 / 正在检测是否收录...
温馨提示:
本文最后更新于 2023-11-01,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

【使用手册】之–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会通知缩放滤镜在输出时保持原始的宽高比。
# 比如,我有这么一个图片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
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                    # 设定音量(百分比)
0

评论区