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

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 1DASH 分片

编解码器指定

查看可用编解码器

# 查看所有编解码器
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            # 复制字幕流

常用编解码器

类型编解码器说明适用场景
视频libx264H.264 编码器通用视频
视频libx265H.265/HEVC 编码器高压缩率
视频libvpx-vp9VP9 编码器Web 视频
视频libaom-av1AV1 编码器下一代视频
视频copy复制流快速处理
音频aacAAC 编码器通用音频
音频libmp3lameMP3 编码器兼容性
音频libopusOpus 编码器低延迟
音频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
-gGOP 大小-g 30
-bfB 帧数量-bf 2
-refs参考帧数-refs 4
-vf视频滤镜-vf scale=1280:720
-af音频滤镜-af volume=2.0
-map流映射-map 0
-metadata元数据-metadata title="Test"
-movflagsMP4 选项-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 进行多媒体处理的基础。在下一章中,我们将深入学习转码技术。