# 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
# 压缩视频文件
# -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
# 去除音频(静音)
# -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
裁切区域会限制在视频区域内
# 剪切视频
# -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)