FFmpeg 多媒体处理教程 / 基本语法
基本语法
概述
本章介绍 FFmpeg 命令行工具的基本语法结构,包括输入输出指定、格式选择、编解码器配置和全局选项的使用方法。
命令行语法结构
基本格式
FFmpeg 命令行的基本语法结构如下:
ffmpeg [全局选项] -i 输入文件 [输入选项] [输出选项] 输出文件
组成部分:
| 组成部分 | 说明 | 示例 |
|---|---|---|
| ffmpeg | 命令名称 | ffmpeg |
| 全局选项 | 影响整个程序的选项 | -y, -v, -threads |
| -i 输入文件 | 输入文件路径 | -i input.mp4 |
| 输入选项 | 作用于输入文件的选项 | -ss 10, -t 60 |
| 输出选项 | 作用于输出文件的选项 | -c:v libx264, -b:a 128k |
| 输出文件 | 输出文件路径 | output.mp4 |
完整示例
# 简单转码
ffmpeg -i input.avi output.mp4
# 带选项的转码
ffmpeg -y -v info -i input.avi -c:v libx264 -c:a aac output.mp4
# 多输入文件
ffmpeg -i video.mp4 -i audio.mp3 -c:v copy -c:a aac output.mp4
# 带滤镜
ffmpeg -i input.mp4 -vf "scale=1280:720" -c:v libx264 -c:a copy output.mp4
输入输出指定
单输入单输出
# 基本输入输出
ffmpeg -i input.mp4 output.avi
# 指定格式
ffmpeg -f lavfi -i testsrc=duration=5:size=640x480 test.mp4
# 从管道输入
cat input.mp4 | ffmpeg -i pipe:0 output.avi
# 输出到管道
ffmpeg -i input.mp4 -f avi pipe:1 | cat > output.avi
多输入单输出
# 合并视频和音频
ffmpeg -i video.mp4 -i audio.mp3 -c:v copy -c:a aac output.mp4
# 合并多个视频
ffmpeg -i video1.mp4 -i video2.mp4 -filter_complex "[0:v][0:a][1:v][1:a]concat=n=2:v=1:a=1[outv][outa]" -map "[outv]" -map "[outa]" output.mp4
# 画中画
ffmpeg -i main.mp4 -i pip.mp4 -filter_complex "overlay=W-w-10:H-h-10" output.mp4
单输入多输出
# 同时输出多种格式
ffmpeg -i input.mp4 -c:v libx264 -c:a aac output1.mp4 -c:v libvpx -c:a libvorbis output2.webm
# 不同质量输出
ffmpeg -i input.mp4 \
-c:v libx264 -crf 23 -c:a aac high.mp4 \
-c:v libx264 -crf 28 -c:a aac -b:a 64k low.mp4
管道输入输出
# 从管道读取
curl http://example.com/video.mp4 | ffmpeg -i pipe:0 output.avi
# 写入管道
ffmpeg -i input.mp4 -f mp4 pipe:1 | curl -X POST -d @- http://example.com/upload
# 多个管道
ffmpeg -i pipe:0 -f mp4 pipe:1 < input.mp4 > output.mp4
格式指定
输入格式
# 自动检测格式(默认)
ffmpeg -i input.mp4 output.avi
# 强制指定输入格式
ffmpeg -f rawvideo -video_size 1920x1080 -pixel_format yuv420p -framerate 30 -i input.yuv output.mp4
# 从设备输入
ffmpeg -f v4l2 -video_size 1280x720 -framerate 30 -i /dev/video0 output.mp4
# 从音频设备输入
ffmpeg -f alsa -i hw:0 output.wav
输出格式
# 自动检测格式(根据扩展名)
ffmpeg -i input.avi output.mp4
# 强制指定输出格式
ffmpeg -i input.avi -f mp4 output.mp4
# 特殊格式
ffmpeg -i input.mp4 -f mp4 -movflags +faststart output.mp4
ffmpeg -i input.mp4 -f mpegts output.ts
ffmpeg -i input.mp4 -f flv rtmp://server/live/stream
常用格式参数
| 格式 | 常用参数 | 说明 |
|---|---|---|
| MP4 | -movflags +faststart | 快速启动(Web 播放优化) |
| MP4 | -movflags +frag_keyframe | 分片 MP4 |
| MKV | -default_mode passthrough | 默认流设置 |
| FLV | -flvflags no_duration_filesize | 无持续时间信息 |
| MPEG-TS | -mpegts_copyts 1 | 保留原始时间戳 |
| WebM | -dash 1 | DASH 分片 |
编解码器指定
查看可用编解码器
# 查看所有编解码器
ffmpeg -codecs
# 查看所有编码器
ffmpeg -encoders
# 查看所有解码器
ffmpeg -decoders
# 查看特定类型编解码器
ffmpeg -codecs | grep video
ffmpeg -codecs | grep audio
指定编解码器
# 视频编解码器
ffmpeg -i input.mp4 -c:v libx264 output.mp4 # 使用 libx264 编码器
ffmpeg -i input.mp4 -c:v copy output.mp4 # 复制视频流(不重新编码)
ffmpeg -i input.mp4 -c:v none output.mp4 # 无视频流
# 音频编解码器
ffmpeg -i input.mp4 -c:a aac output.mp4 # 使用 AAC 编码器
ffmpeg -i input.mp4 -c:a copy output.mp4 # 复制音频流
ffmpeg -i input.mp4 -c:a none output.mp4 # 无音频流
# 字幕编解码器
ffmpeg -i input.mkv -c:s mov_text output.mp4 # 转换字幕格式
ffmpeg -i input.mkv -c:s copy output.mkv # 复制字幕流
常用编解码器
| 类型 | 编解码器 | 说明 | 适用场景 |
|---|---|---|---|
| 视频 | libx264 | H.264 编码器 | 通用视频 |
| 视频 | libx265 | H.265/HEVC 编码器 | 高压缩率 |
| 视频 | libvpx-vp9 | VP9 编码器 | Web 视频 |
| 视频 | libaom-av1 | AV1 编码器 | 下一代视频 |
| 视频 | copy | 复制流 | 快速处理 |
| 音频 | aac | AAC 编码器 | 通用音频 |
| 音频 | libmp3lame | MP3 编码器 | 兼容性 |
| 音频 | libopus | Opus 编码器 | 低延迟 |
| 音频 | copy | 复制流 | 快速处理 |
编解码器参数
# 视频编码器参数
ffmpeg -i input.mp4 -c:v libx264 -preset medium -crf 23 output.mp4
# 音频编码器参数
ffmpeg -i input.mp4 -c:a aac -b:a 192k -ar 44100 output.mp4
# 查看编码器支持的参数
ffmpeg -h encoder=libx264
ffmpeg -h encoder=aac
流选择
流标识符
FFmpeg 使用流标识符来指定具体的流:
| 标识符 | 说明 | 示例 |
|---|---|---|
-map 0 | 选择第一个输入的所有流 | -map 0 |
-map 0:v | 选择第一个输入的视频流 | -map 0:v |
-map 0:a | 选择第一个输入的音频流 | -map 0:a |
-map 0:s | 选择第一个输入的字幕流 | -map 0:s |
-map 0:v:0 | 选择第一个输入的第一个视频流 | -map 0:v:0 |
-map 0:a:1 | 选择第一个输入的第二个音频流 | -map 0:a:1 |
-map 1:v | 选择第二个输入的视频流 | -map 1:v |
-map -0:a | 排除第一个输入的音频流 | -map -0:a |
流选择示例
# 选择特定流
ffmpeg -i input.mp4 -map 0:v:0 -map 0:a:0 -c copy output.mp4
# 选择多个音频流
ffmpeg -i input.mkv -map 0:v -map 0:a:0 -map 0:a:1 -c copy output.mp4
# 排除字幕流
ffmpeg -i input.mkv -map 0 -map -0:s -c copy output.mp4
# 合并不同输入的流
ffmpeg -i video.mp4 -i audio.mp3 -map 0:v -map 1:a -c copy output.mp4
流类型指定
# 仅处理视频流
ffmpeg -i input.mp4 -vn output.mp3
# 仅处理音频流
ffmpeg -i input.mp4 -an output.mp4
# 仅处理字幕流
ffmpeg -i input.mkv -sn output.mkv
# 禁用所有特定类型流
ffmpeg -i input.mp4 -vn -an -sn output.mp4
全局选项
常用全局选项
| 选项 | 说明 | 示例 |
|---|---|---|
-y | 覆盖输出文件 | -y |
-n | 不覆盖输出文件 | -n |
-v | 日志级别 | -v info |
-loglevel | 日志级别 | -loglevel warning |
-hide_banner | 隐藏横幅 | -hide_banner |
-threads | 线程数 | -threads 4 |
-filter_threads | 滤镜线程数 | -filter_threads 2 |
-stdin | 启用标准输入 | -stdin |
-benchmark | 显示性能统计 | -benchmark |
-timelimit | 处理时间限制 | -timelimit 300 |
日志级别
| 级别 | 说明 | 适用场景 |
|---|---|---|
quiet | 静默模式 | 脚本批处理 |
panic | 仅显示致命错误 | 生产环境 |
fatal | 显示致命错误 | 生产环境 |
error | 显示错误 | 一般使用 |
warning | 显示警告 | 调试 |
info | 显示信息 | 日常使用 |
verbose | 显示详细信息 | 调试 |
debug | 显示调试信息 | 开发调试 |
trace | 显示跟踪信息 | 深度调试 |
使用示例
# 静默模式
ffmpeg -y -v quiet -i input.mp4 output.mp4
# 详细日志
ffmpeg -v verbose -i input.mp4 output.mp4
# 隐藏横幅
ffmpeg -hide_banner -i input.mp4 output.mp4
# 指定线程数
ffmpeg -threads 4 -i input.mp4 output.mp4
# 显示性能统计
ffmpeg -benchmark -i input.mp4 output.mp4
输入选项
常用输入选项
| 选项 | 说明 | 示例 |
|---|---|---|
-i | 输入文件 | -i input.mp4 |
-ss | 开始时间 | -ss 00:01:30 |
-t | 持续时间 | -t 60 |
-to | 结束时间 | -to 00:02:30 |
-itsoffset | 输入时间偏移 | -itsoffset 0.5 |
-re | 按原始帧率读取 | -re |
-f | 输入格式 | -f rawvideo |
-r | 帧率 | -r 30 |
-s | 视频尺寸 | -s 1920x1080 |
-pix_fmt | 像素格式 | -pix_fmt yuv420p |
-ar | 音频采样率 | -ar 44100 |
-ac | 音频声道数 | -ac 2 |
-sample_fmt | 音频采样格式 | -sample_fmt s16 |
时间指定
# 从 1 分 30 秒开始
ffmpeg -ss 00:01:30 -i input.mp4 output.mp4
# 持续 60 秒
ffmpeg -t 60 -i input.mp4 output.mp4
# 到 2 分 30 秒结束
ffmpeg -to 00:02:30 -i input.mp4 output.mp4
# 组合使用
ffmpeg -ss 00:01:30 -t 60 -i input.mp4 output.mp4
# 使用秒数
ffmpeg -ss 90 -i input.mp4 output.mp4
# 输入时间偏移
ffmpeg -itsoffset 0.5 -i input.mp4 output.mp4
视频参数
# 指定帧率
ffmpeg -r 30 -i input.mp4 output.mp4
# 指定尺寸
ffmpeg -s 1920x1080 -i input.mp4 output.mp4
# 指定像素格式
ffmpeg -pix_fmt yuv420p -i input.mp4 output.mp4
# 组合使用
ffmpeg -r 30 -s 1920x1080 -pix_fmt yuv420p -i input.yuv output.mp4
音频参数
# 指定采样率
ffmpeg -ar 44100 -i input.wav output.mp3
# 指定声道数
ffmpeg -ac 2 -i input.wav output.mp3
# 指定采样格式
ffmpeg -sample_fmt s16 -i input.wav output.mp3
# 组合使用
ffmpeg -ar 44100 -ac 2 -sample_fmt s16 -i input.wav output.mp3
输出选项
常用输出选项
| 选项 | 说明 | 示例 |
|---|---|---|
-c | 编解码器 | -c:v libx264 |
-b | 码率 | -b:v 2M |
-b:v | 视频码率 | -b:v 2M |
-b:a | 音频码率 | -b:a 128k |
-crf | 恒定质量因子 | -crf 23 |
-preset | 编码预设 | -preset medium |
-profile:v | 视频配置 | -profile:v high |
-level | 编码级别 | -level 4.1 |
-g | GOP 大小 | -g 30 |
-bf | B 帧数量 | -bf 2 |
-refs | 参考帧数 | -refs 4 |
-vf | 视频滤镜 | -vf scale=1280:720 |
-af | 音频滤镜 | -af volume=2.0 |
-map | 流映射 | -map 0 |
-metadata | 元数据 | -metadata title="Test" |
-movflags | MP4 选项 | -movflags +faststart |
-shortest | 最短流结束 | -shortest |
-fs | 文件大小限制 | -fs 100M |
视频输出选项
# 视频编解码器
ffmpeg -i input.mp4 -c:v libx264 output.mp4
# 视频码率
ffmpeg -i input.mp4 -c:v libx264 -b:v 2M output.mp4
# 恒定质量因子(推荐)
ffmpeg -i input.mp4 -c:v libx264 -crf 23 output.mp4
# 编码预设
ffmpeg -i input.mp4 -c:v libx264 -preset medium output.mp4
# 视频配置
ffmpeg -i input.mp4 -c:v libx264 -profile:v high output.mp4
# 编码级别
ffmpeg -i input.mp4 -c:v libx264 -level 4.1 output.mp4
# GOP 大小
ffmpeg -i input.mp4 -c:v libx264 -g 30 output.mp4
# B 帧数量
ffmpeg -i input.mp4 -c:v libx264 -bf 2 output.mp4
# 参考帧数
ffmpeg -i input.mp4 -c:v libx264 -refs 4 output.mp4
音频输出选项
# 音频编解码器
ffmpeg -i input.mp4 -c:a aac output.mp4
# 音频码率
ffmpeg -i input.mp4 -c:a aac -b:a 192k output.mp4
# 采样率
ffmpeg -i input.mp4 -c:a aac -ar 44100 output.mp4
# 声道数
ffmpeg -i input.mp4 -c:a aac -ac 2 output.mp4
# 组合使用
ffmpeg -i input.mp4 -c:a aac -b:a 192k -ar 44100 -ac 2 output.mp4
滤镜选项
视频滤镜
# 简单滤镜
ffmpeg -i input.mp4 -vf "scale=1280:720" output.mp4
# 多个滤镜
ffmpeg -i input.mp4 -vf "scale=1280:720,transpose=1" output.mp4
# 复杂滤镜图
ffmpeg -i input.mp4 -filter_complex "[0:v]scale=1280:720[v];[0:a]volume=2.0[a]" -map "[v]" -map "[a]" output.mp4
音频滤镜
# 简单滤镜
ffmpeg -i input.mp4 -af "volume=2.0" output.mp4
# 多个滤镜
ffmpeg -i input.mp4 -af "volume=2.0,aresample=44100" output.mp4
# 复杂滤镜图
ffmpeg -i input.mp4 -filter_complex "[0:a]volume=2.0[a]" -map 0:v -map "[a]" output.mp4
元数据选项
查看元数据
# 查看文件元数据
ffprobe -v quiet -print_format json -show_format -show_streams input.mp4
设置元数据
# 设置标题
ffmpeg -i input.mp4 -metadata title="My Video" output.mp4
# 设置作者
ffmpeg -i input.mp4 -metadata author="John Doe" output.mp4
# 设置版权
ffmpeg -i input.mp4 -metadata copyright="Copyright 2024" output.mp4
# 设置多个元数据
ffmpeg -i input.mp4 \
-metadata title="My Video" \
-metadata author="John Doe" \
-metadata comment="Test video" \
output.mp4
# 删除元数据
ffmpeg -i input.mp4 -map_metadata -1 output.mp4
章节选项
使用章节文件
# 创建章节文件 chapters.txt
# 格式:
# CHAPTER01=00:00:00.000
# CHAPTER01NAME=Introduction
# CHAPTER02=00:05:00.000
# CHAPTER02NAME=Main Content
# 应用章节
ffmpeg -i input.mp4 -i chapters.txt -map_metadata 1 output.mp4
高级用法
条件编码
# 仅当视频不是 H.264 时才转码
ffmpeg -i input.mp4 -c:v copy output.mp4
# 检查视频编码器
ffprobe -v quiet -select_streams v:0 -show_entries stream=codec_name -of csv=p=0 input.mp4
优化选项
# 快速启动(Web 播放优化)
ffmpeg -i input.mp4 -c:v libx264 -movflags +faststart output.mp4
# 分片 MP4(DASH/HLS)
ffmpeg -i input.mp4 -c:v libx264 -movflags +frag_keyframe+empty_moov output.mp4
# 流媒体优化
ffmpeg -i input.mp4 -c:v libx264 -tune zerolatency -preset ultrafast output.mp4
注意事项
- 选项顺序:全局选项在最前面,输入选项在
-i之前,输出选项在-i之后 - 流映射:使用
-map明确指定流,避免自动选择导致的问题 - 编解码器选择:
copy最快但不能改变格式参数 - 时间精度:
-ss在-i之前是快速但不精确,在-i之后是慢速但精确 - 内存占用:处理大文件时注意内存使用,可使用
-fs限制输出大小
业务场景
场景 1:视频格式转换
需求: 将 AVI 转换为 MP4
ffmpeg -i input.avi -c:v libx264 -c:a aac -movflags +faststart output.mp4
场景 2:视频裁剪
需求: 提取视频片段
# 快速裁剪(不精确)
ffmpeg -ss 00:01:00 -i input.mp4 -t 30 -c copy output.mp4
# 精确裁剪
ffmpeg -i input.mp4 -ss 00:01:00 -t 30 -c:v libx264 -c:a aac output.mp4
场景 3:音频提取
需求: 从视频中提取音频
ffmpeg -i input.mp4 -vn -c:a libmp3lame -q:a 2 output.mp3
场景 4:分辨率调整
需求: 降低视频分辨率
ffmpeg -i input.mp4 -vf scale=1280:720 -c:v libx264 -c:a copy output.mp4
扩展阅读
总结
本章介绍了 FFmpeg 的基本语法,包括:
- 命令行语法结构
- 输入输出指定方法
- 格式与编解码器选择
- 全局选项的使用
- 流选择和映射
掌握这些基础知识是使用 FFmpeg 进行多媒体处理的基础。在下一章中,我们将深入学习转码技术。