强曰为道
与天地相似,故不违。知周乎万物,而道济天下,故不过。旁行而不流,乐天知命,故不忧.
文档目录

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

注意事项

  1. 选项顺序:全局选项在最前面,输入选项在 -i 之前,输出选项在 -i 之后
  2. 流映射:使用 -map 明确指定流,避免自动选择导致的问题
  3. 编解码器选择copy 最快但不能改变格式参数
  4. 时间精度-ss-i 之前是快速但不精确,在 -i 之后是慢速但精确
  5. 内存占用:处理大文件时注意内存使用,可使用 -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

扩展阅读

  1. FFmpeg 官方文档
  2. FFmpeg 命令行选项
  3. FFmpeg 编解码器选项
  4. FFmpeg 格式选项
  5. FFmpeg 滤镜选项

总结

本章介绍了 FFmpeg 的基本语法,包括:

  • 命令行语法结构
  • 输入输出指定方法
  • 格式与编解码器选择
  • 全局选项的使用
  • 流选择和映射

掌握这些基础知识是使用 FFmpeg 进行多媒体处理的基础。在下一章中,我们将深入学习转码技术。