# FFmpeg

# FFmpeg 是什么?

FFmpeg 是领先的多媒体框架,它能够解码、编码、转码、mux、demux、流、过滤和播放几乎所有人类和机器创造的东西。它支持最古老的到目前最流行最时尚的多媒体文件格式,不管它们是由标准委员会、社区还是公司设计的。

# 安装

# Windows

官网下载安装,下载 build 包,安装后配置环境变量即可

# 举例
FFMPEG_PATH:D:\Software\FFmpeg\bin
Path:D:\Software\FFmpeg\bin

# Linux

# 添加软件源
apt install wget
wget https://download1.rpmfusion.org/free/el/rpmfusion-free-release-7.noarch.rpm 2
wget https://download1.rpmfusion.org/nonfree/el/rpmfusion-nonfree-release-7.noarch.rpm 1
apt install rpm
rpm -ivh *.rpm
rpm --import http://li.nux.ro/download/nux/RPM-GPG-KEY-nux.ro 2
rpm -Uvh http://li.nux.ro/download/nux/dextop/el7/x86_64/nux-dextop-release-0-1.el7.nux.noarch.rpm 2
# 或者使用更新
apt update
# ubuntu
apt install ffmpeg

# 基本语法

ffmpeg [ 全局选项] {[ 输入文件选项] -i 输入地址} ... {[ 输出文件选项] 输出地址} ...

# 打印帮助

ffmpeg -h
-L                    # show license
-h  -? -help --help   # show help
-version          # show version
-buildconf        # show build configuration
-formats          # show supported formats
-muxers           # 显示可用的音视频复用器(混合音视频)
-demuxers         # 显示可用的音视频分离器(分离音视频)
-devices          # 显示可用的设备
-codecs           # 显示可用的编解码器
-decoders
-encoders
-bsfs             # 显示可用的比特流筛选器
-protocols        # 显示可用的协议
-filters          # 显示可用的libavfilter过滤器
-pix_fmts         # 显示可用的像素格式
-layouts          # 显示频道名称和标准频道布局
-sample_fmts      # 显示可用的样本格式
-colors           # 显示公认的颜色名称
-sources device   # 显示输入设备的自动检测源
-sinks device     # 显示输出设备的自动检测接收器
-hwaccels         # 显示可用的硬件加速方法

# 全局选项

-loglevel loglevel
-v loglevel       # set logging level
-report
-y                # 覆盖输出文件,不要询问
-n                # 不要覆盖输出文件

# 主要选项

-f fmt       # 强制输入或输出的格式,不要经常使用
-i url       # 输入文件的地址
-codec:[a|v] libx264 (input/output)  # 选择一个编码器
-c:[a|v] libx264 (input/output)      # 缩写
-t duration       # 限制输入时的读取时间,限制输出时的写入时间
                  # [-][HH:]MM:SS[.m...] or [-]S+[.m...][s|ms|us]
-to position      # 停止写入输出或读取position处的输入,参考duration
-fs limit_size    # 设置文件大小限制,单位字节,byte
-ss position      # 设置起始位置(时间)
-qscale:v         # 控制视频质量 0 保持视频质量
-vframes number   # 设置要输出视频帧数 应该使用-frames:v
-r:v rate         # 设置帧率
-s size           # 设置帧的大小
-vcodec codec     # 设置视频编解码器 这是 -codec:v的别名
-preset           # 指定输出的视频质量,会影响文件的生成速度

# FFmpeg 常用命令

# 获取基本信息

ffmpeg -i input.mp4

ffmpeg -i input.mp4 -hide_banner

# 格式转换

ffmpeg -i input.mp3 output.ogg
ffmpeg -i input.mp4 output.avi
ffmpeg -i input.flv output.mpeg
# 维持视频质量进行转换 -qscale 0
ffmpeg -i input.webm -qscale 0 output.mp4
# 列出支持的格式
ffmpeg -formats

mp4vsavi

# 压缩视频文件

# -crf 0 为无损 51最差 一般建议 18~28
# -preset 指定的编码速度越慢,获得的压缩效率就越高
ffmpeg -i input.mp4 -vf scale=1280:-1 -c:v libx264 -preset veryslow -crf 18 output_crf18.mp4
# 上面没有处理音频,使用下面的选项可以压缩音频
# -ac 2 -c:a aac -strict -2 -b:a 128k

# 压缩音频文件

# -ar 控制采样率
# -ab audiobit 控制音频比特率  96k 112k 128k 160k  单位kbps
ffmpeg -i input.mp3 -ab 96k output_96k.mp3

# 修改分辨率

# -c:a copy 音频不做处理
ffmpeg -i input.mp4 -filter:v scale=1280:720 -c:a copy output.mp4
ffmpeg -i input.mp4 -s 1280x720 -c:a copy output_1280x720.mp4

# 提取音频

# -vn video no
ffmpeg -i input.mp4 -vn output.mp3
# -ar audiorate 指定采样率
# -ac audiochannel 2 指定双声道
# -ab audiobit 指定音频比特率
# -f 输出文件格式
ffmpeg -i input.mp4 -vn -ar 44100 -ac 2 -ab 320 -f mp3 output.mp3
# -ab 320 指定 audiobit 为320kpbs
ffmpeg -i input.mp4 -vn -ab 320k output_320k.mp3

audio

# 去除音频(静音)

# -an audio no
ffmpeg -i input.mp4 -an output_noaudio.mp4

# 提取图像(生成缩略图)

mkdir images
ffmpeg -i input.mp4 -r 1 -f image2 ./images/image-%3d.png
# -r 1 每秒提取1帧 默认值为25
# -f iamge2  输出格式 image2 图片
# image-%3d.png  命名 image-001.png
# 反过来 图片序列转视频
ffmpeg -r 1/10 -i ./images/image-%3d.png -c:v libx264 -r 30 -pix_fmt yuv420p video.mp4
# -r 1/10 每张图像图像显示10s
# -i ./images/image-%3d.png 读取image-开头带3为数字以png结尾的图片
# -c:v libx264 指定视频编解码器为h264
# -r 30 输出帧率
# -pix_fmt yuv420p 输出视频分辨率

# 图片转换(YUV)

ffmpeg -i input.png -pix_fmt yuv420p output.yuv

# 测试音视频

ffplay input.mp4
ffplay input.mp3

# 其他命令

# -threads 4  启用多线程
# -c:v h264_nvenc 使用N卡硬件加速

# 裁剪图像

请注意,剪切视频将影响质量。除非必要,请勿剪切

# 语法
ffmpeg -i input.mp4 -filter:v "crop=w:h:x:y" output.mp4
# crop 裁切 w  h x  y 矩形的宽度 高度  x坐标 y 坐标
ffmpeg -i input.mp4 -filter:v "crop=640:360:160:90" output_crop.mp4

裁切区域会限制在视频区域内

crop

# 剪切视频

# -ss 指定开始时间 默认为0
ffmpeg -i input.mp4 -ss 30 output_cut_30s_to_end.mp4
# -t  指定持续时间 单位为秒 也可以使用hh:mm:ss格式指定
ffmpeg -i input.mp4 -t 30 output_cut_start_to_30s.mp4
ffmpeg -i input.mp4 -t 00:00:30 output_cut_start_to_30s.mp4
# 搭配使用 剪切 00:00:30 到 00:01:30
ffmpeg -i input.mp4 -ss 00:00:30 -t 00:01:00 output_cut_30s_to_90s.mp4
# 搭配使用 剪切成多个部分 00:00:00-00:01:00 part.mp4 00:01:00-end part2.mp4
mkdir videos
ffmpeg -i input.mp4 -t 00:01:00  ./videos/part1.mp4 -ss 00:01:00 ./videos/part2.mp4

# 剪切音频

# 同理 00:00:30-00:01:30s
ffmpeg -i input.mp3 -ss 00:00:30 -t 00:01:00  output_cut_30s_to_90s.mp3
# 同理 00:00:00-00:01:00 part.mp3 00:01:00-end part2.mp3
mkdir audios
ffmpeg -i input.mp3 -t 00:01:00  ./audios/part1.mp3 -ss 00:01:00  ./audios/part2.mp3

# 设置视频宽高比

# aspect 16:9 4:3 16:10
ffmpeg -i input.mp4 -aspect 4:3 output_aspect_4:3.mp4

# 添加封面到音频

# 提取音频
ffmpeg -i input.mp4 -vn input.mp3
# 提取图像
ffmpeg -i input.mp4 -r 1 -f image2 ./images/image-%3d.png
# 复制图像
cp  ./images/image-001.png  ./input.png  -rf
ffmpeg -loop 1 -i input.png -i input.mp3  output_one_image.mp4
# -loop 1 表示图片无限循环
# shortest 表示音频结束,输出视频就结束

# 合并视频

# join.txt
file ./videos/part1.mp4
file ./videos/part2.mp4
ffmpeg -f  concat  -i join.txt -c copy ./videos/merge.mp4
# 如果提示  join.txt: Operation not permitted 添加 -safe 0
ffmpeg -f  concat -safe 0  -i join.txt -c copy ./videos/merge.mp4

# 调整速度

# 两倍速
ffmpeg -i input.mp4 -vf "setpts=0.5*PTS" output_0.5pts.mp4
# 0.25倍速
ffmpeg -i input.mp4 -vf "setpts=4.0*PTS" output_4.0pts.mp4

# FFmpeg 速查表

# 基础参数

-codecs                                                     # 列出可用编码
-formats                                                    # 列出支持的格式
-protocols                                                  # 列出支持的协议
-i input.mp4                                                # 指定输入文件
-c:v libx264                                                # 指定视频编码
-c:a aac                                                    # 指定音频编码
-vcodec libx264                                             # 旧写法
-acodec aac                                                 # 旧写法
-fs SIZE                                                    # 指定文件大小

# 音频参数

-aq QUALITY                                                 # 音频质量,编码器相关
-ar 44100                                                   # 音频采样率
-ac 1                                                       # 音频声道数量
-an                                                         # 禁止音频
-vol 512                                                    # 改变音量为 200%

# 视频参数

-aspect RATIO                                               # 长宽比 4:3, 16:9
-r RATE                                                     # 每秒帧率
-s WIDTHxHEIGHT                                             # 视频尺寸:640x480
-vn                                                         # 禁用视频

# 码率设置

-b:v 1M                                                     # 设置视频码率 1mbps/s
-b:a 1M                                                     # 设置音频码率 1mbps/s

# 视频转码

ffmpeg -i input.mov output.mp4                              # 转码为 MP4
ffmpeg -i input.mp4 -vn -c:a copy output.aac                # 提取音频
ffmpeg -i input.mp4 -vn -c:a mp3 output.mp3                 # 提取音频并转码
ffmpeg -i input.mov -c:v libx264 -c:a aac -2 out.mp4        # 指定编码参数
ffmpeg -i input.mov -c:v libvpx -c:a libvorbis out.webm     # 转换 webm
ffmpeg -i input.mp4 -ab 56 -ar 44100 -b 200 -f flv out.flv  # 转换 flv
ffmpeg -i input.mp4 -an animated.gif                        # 转换 GIF

# 切分视频

ffmpeg -i input.mp4 -ss 0 -t 60 first-1-min.mp4             # 切割开头一分钟
ffmpeg -i input.mp4 -ss 60 -t 60 second-1-min.mp4           # 一分钟到两分钟
ffmpeg -i input.mp4 -ss 00:01:23.000 -t 60 first-1-min.mp4  # 另一种时间格式

# 视频尺寸

ffmpeg -i input.mp4 -vf "scale=640:320" output.mp4          # 视频尺寸缩放
ffmpeg -i input.mp4 -vf "crop=400:300:10:10" output.mp4     # 视频尺寸裁剪

# 其他用法

ffmpeg -i sub.srt sub.ass                                   # 字幕格式转换
ffmpeg -i input.mp4 -vf ass=sub.ass out.mp4                 # 烧录字幕进视频
ffmpeg -i "<url>" out.mp4                                   # 下载视频

# 组合用法

### 给 gif 加上静音音轨并转换成 mp4

ffmpeg -f lavfi -i anullsrc -i in.gif -c:v libx264 -c:a aac -shortest out.mp4

### 给 gif 加上静音音轨并转换成 mp4,兼容手机播放
ffmpeg -f lavfi -i anullsrc -i in.gif -c:v libx264 -c:a aac -shortest \
       -pix_fmt yuv420p -vf "scale=trunc(iw/2)*2:trunc(ih/2)*2" out.mp4

# 学习资料

FFmpeg 视频处理入门教程 (opens new window)

FFmpeg 最最强大的视频工具 (opens new window)

FFmpeg 中文文档 (opens new window)

给新手的 20+个 FFmpeg 命令 (opens new window)

如何在 Linux 中创建动画 GIF (opens new window)

FFmpeg cheat sheet (opens new window)

https://cheatography.com/thetartankilt/cheat-sheets/ffmpeg/

http://qwinff.github.io/

ffmpeg 处理 RTMP 流媒体的命令大全 - 雷霄骅的博客 (opens new window)

FFmpeg 视频处理入门教程 - 阮一峰的博客 (opens new window)

浏览器中的音视频知识总结 - 掘金 (opens new window)