FFmpeg
FFmpeg 是一款功能强大的音视频处理工具,掌握其参数和背后的音视频知识能帮你更高效地进行媒体文件处理。下面这个表格汇总了 FFmpeg 的常用参数类别和音视频相关的基础概念,方便你快速了解全貌。
类别 | 主要项 | 关键点/示例 |
---|---|---|
FFmpeg 核心参数 | 输入/输出 -i , -y , -f |
-i input.mp4 指定输入文件,-y 覆盖输出文件,-f mp4 指定输出格式 |
视频参数 -c:v , -b:v , -r , -s , -crf |
-c:v libx264 指定视频编码器,-b:v 1M 设置视频码率,-r 30 设置帧率,-s 1280x720 设置分辨率,-crf 23 控制质量(值越小质量越高) |
|
音频参数 -c:a , -b:a , -ar , -ac |
-c:a aac 指定音频编码器,-b:a 128k 设置音频码率,-ar 44100 设置采样率,-ac 2 设置声道数 |
|
时间控制 -ss , -t , -to |
-ss 00:01:00 从第1分钟开始,-t 00:00:30 处理30秒内容 |
|
滤镜 -vf , -af , -filter_complex |
-vf "scale=640:480" 缩放视频,-filter_complex 处理复杂流 |
|
音视频基础概念 | 封装格式 (容器) | MP4, MKV, AVI, MOV, FLV 等,如同“碗”,里面装着视频、音频、字幕等“饭菜” |
视频编码方式 | H.264/AVC (兼容性好), H.265/HEVC (压缩率高), MPEG-4, VP9, AV1 | |
音频编码方式 | AAC (高效率), MP3 (流行), AC-3 (多声道), PCM (无损), FLAC (无损压缩) | |
关键技术指标 | 分辨率、帧率 (fps)、码率、采样率、声道数 |
FFmpeg 的参数非常灵活,通过组合可以实现各种功能。
基本转码命令:一个典型的将输入视频转换为指定格式和质量的命令如下:
ffmpeg -i input.avi -c:v libx264 -crf 23 -preset slow -c:a aac -b:a 128k output.mp4
这里
-preset slow
表示编码速度慢但压缩效率高、质量好高级技巧示例:
无损提取流:使用
copy
参数可以快速分离视频或音频流,无需重新编码,速度极快且无质量损失ffmpeg -i input.mp4 -vcodec copy -an video_only.mp4 # 提取纯视频 ffmpeg -i input.mp4 -acodec copy -vn audio_only.m4a # 提取纯音频
合并音视频:将单独的视频文件和音频文件合并。
ffmpeg -i video.mp4 -i audio.m4a -map 0:v -map 1:a -c:v copy -c:a copy output.mp4
添加水印:使用滤镜功能。
ffmpeg -i input.mp4 -i logo.png -filter_complex overlay=10:10 output.mp4
📁 理解封装与编码
封装格式和编码格式是音视频领域的两个核心概念。
封装格式(容器):它就像一个容器,里面可以包裹视频流、音频流、字幕、元数据等。不同的容器支持的内容和特性不同。例如,MP4 兼容性非常好,是网络视频的主流选择
;MKV 则以其开放性和强大的包容性著称,能容纳几乎任何编码的视频、音频和字幕
视频编码:目的是将庞大的原始视频数据压缩成更小的文件。关键在于平衡文件大小和画面质量。
- H.264/AVC:是目前最广泛支持的编码格式,在压缩比、画质和兼容性上取得了很好的平衡,是大多数场景的安全选择
- H.265/HEVC:在相同画质下比 H.264 能再节省约40%的带宽和存储空间,尤其适合4K等高清视频,但对设备性能要求更高
- AV1:作为开放且免版权费的下一代编码标准,压缩效率很高,但编码速度较慢且硬件支持仍在普及中
音频编码:同样是为了减小数据量。
- AAC:是目前的主流选择,在比MP3更低的码率下能提供更好的音质
- MP3:虽然是有损压缩,但由于其极佳的兼容性和尚可的音质,依然非常流行
- 无损编码(如 FLAC, ALAC):完整保留原始音频数据,适合音乐存档和高质量播放,但文件体积较大
💡 实用建议与命令
根据你的具体目标,可以参考以下建议:
日常通用转换(兼顾质量与体积):
ffmpeg -i input.mov -c:v libx264 -crf 23 -preset medium -c:a aac -movflags +faststart output.mp4
-movflags +faststart
参数能让视频在网络上更快地开始播放追求高画质(保留原始质量或高质量编码):
- 直接复制流(完全无损):
ffmpeg -i input.mov -c copy output.mp4
- 高质量重编码:
ffmpeg -i input.mov -c:v libx264 -crf 18 -preset slow -c:a copy output.mp4
。CRF值18被认为是视觉无损的
- 直接复制流(完全无损):
为网络传输减小文件体积:
ffmpeg -i input.avi -c:v libx265 -crf 28 -preset medium -c:a aac -b:a 64k output.mp4
使用H.265编码和较高的CRF值,并降低音频码率
FFmpeg 确实是处理视频任务的利器,涵盖转码、裁剪、水印、加密等。下面我用实际例子说明这些操作,并附上关键参数解释
功能类别 | 核心命令/滤镜 | 关键参数/选项 | 主要特点/输出 |
---|---|---|---|
视频压缩与转码 | ffmpeg -i input.mp4 -c:v libx264 -crf 23 -preset medium -c:a aac output.mp4 |
-crf (质量), -preset (速度/效率), -b:v (目标码率) |
平衡文件大小与质量,支持多种编码器(H.264, H.265, AV1) |
按时间区间裁剪 | ffmpeg -ss 00:01:00 -to 00:02:00 -i input.mp4 -c copy output_cut.mp4 |
-ss (开始时间), -to (结束时间), -c copy (流复制) |
快速但不精确(依赖关键帧);如需精确到帧,需重新编码 -c:v libx264 |
添加水印 | 图片水印:overlay 滤镜;文字水印:drawtext 滤镜 |
overlay=x:y (位置), drawtext=text='Text':x:y:fontcolor=white:fontsize=24 (文字属性) |
支持静态、动态位置(滚动效果),可叠加多个水印 |
按指定坐标裁剪 | ffmpeg -i input.mp4 -vf "crop=w:h:x:y" output_crop.mp4 |
crop=宽度:高度:起始X坐标:起始Y坐标 |
精确裁剪视频区域,常用于去除黑边或聚焦特定区域 |
加密处理 | 使用 -encryption_scheme 和 -encryption_key 参数(需支持此选项的编码器) |
指定加密方案和密钥 | 保护视频内容,通常需要特定播放环境支持 |
插入自定义 SEI 信息 | ffmpeg -i input.mp4 -c copy -bsf:v "h264_metadata=sei_user_data='yourdata'" output.mp4 |
-bsf:v (比特流过滤器), h264_metadata=sei_user_data |
在视频流中嵌入自定义数据(如版权、时间戳),对播放透明 |
自定义覆盖物 | 使用 overlay 滤镜复合多个输入源(如图片、GIF、另一视频) |
复杂布局需定义多个输入和滤镜链 | 实现画中画、贴纸、动态叠加等效果 |
💡 视频压缩与编码转换
视频压缩和转换编码格式(Codec)是减小文件体积、保证画质或提高兼容性的基础。最常用的控制参数是 -crf
(Constant Rate Factor)和 -preset
。
- CRF(Constant Rate Factor):范围通常是0(无损)到51。值越小,质量越高,文件越大。对于H.264,23是默认值,18-28是常用范围;对于H.265,28是常用默认值
- Preset:控制编码速度与压缩效率的平衡。从
ultrafast
(编码最快,但文件最大)到veryslow
(编码最慢,但文件最小)
常用示例:
# 转换为高兼容性的H.264格式,中等速度和质量
ffmpeg -i input.mov -c:v libx264 -crf 23 -preset medium -c:a aac output.mp4
# 使用更高效的H.265(HEVC)编码,进一步减小文件体积,slow编码速度慢,文件大
ffmpeg -i input.mp4 -c:v libx265 -crf 28 -preset slow -c:a aac output_h265.mp4
# 快速压缩,显著减小体积(适用于网络传输)slow编码速度快,文件小
ffmpeg -i input.avi -c:v libx264 -crf 30 -preset fast -vf "scale=1280:-2" -r 24 -c:a aac -b:a 64k output_small.mp4
✂️ 按时间区间裁剪视频
裁剪视频时,根据对时间点精确度的要求,选择不同的方法。
快速裁剪(流复制):使用
-c copy
直接复制视频和音频流,速度极快。但裁剪点会自动对齐到最接近的关键帧(I-frame),可能不精确# 快速裁剪,从1分钟到2分钟 ffmpeg -ss 00:01:00 -to 00:02:00 -i input.mp4 -c copy output_cut.mp4
注意:
-ss
参数放在-i
之前有助于加速定位精确裁剪(重新编码):通过重新编码实现帧级精确裁剪,但速度慢很多
# 精确裁剪,从1分钟到2分钟,但会重新编码 ffmpeg -ss 00:01:00 -to 00:02:00 -i input.mp4 -c:v libx264 -preset ultrafast -c:a aac output_cut_precise.mp4
🏷️ 添加视频和文字水印
使用滤镜(filter)为视频添加水印,功能非常强大。
添加图片水印:使用
overlay
滤镜。# 将watermark.png添加到视频左上角,偏移10像素 ffmpeg -i input.mp4 -i watermark.png -filter_complex "[0:v][1:v] overlay=10:10" -c:a copy output_watermarked.mp4
位置可以灵活设定,例如右下角:
overlay=W-w-10:H-h-10
(W/H是视频宽高,w/h是水印图片宽高)添加文字水印:使用
drawtext
滤镜。# 在右上角添加白色半透明文字水印 ffmpeg -i input.mp4 -vf "drawtext=text='Sample Text':x=w-tw-10:y=10:fontcolor=white:fontsize=24:alpha=0.7" -c:a copy output_text.mp4
还可以实现滚动文字效果,例如从右向左滚动:
x='w-tw-t*100'
🔲 按指定坐标裁剪画面
使用 crop
滤镜可以精确裁剪出视频的某一部分。
# 从画面(100,50)坐标处开始,裁剪出一个400x300像素的区域
ffmpeg -i input.mp4 -vf "crop=400:300:100:50" output_cropped.mp4
这个功能常用于去除视频的黑边或只保留画面中重要的部分
🔐 加密处理
FFmpeg 支持一些基本的 加密功能,但通常需要特定的编码器和参数。
# 示例:使用H.264编码并应用加密(具体方案和密钥需根据实际情况调整)
ffmpeg -i input.mp4 -c:v libx264 -encryption_scheme cenc-aes-ctr -encryption_key 12345678901234561234567890123456 -encryption_kid aabbccddeeff0011aabbccddeeff0011 output_encrypted.mp4
请注意:这是一种相对基础的加密方式,复杂的商业系统(如 Widevine、FairPlay)通常需要更专业的工具和集成环境
📄 插入自定义 SEI 信息
SEI(Supplemental Enhancement Information)信息可以嵌入到视频流中,用于传递自定义数据(如版权信息、时间码),这些信息不会影响正常播放。
# 使用比特流过滤器(bitstream filter)为H.264视频流插入自定义SEI数据
ffmpeg -i input.mp4 -c copy -bsf:v "h264_metadata=sei_user_data=086f3693adb7dc21711a49e3dbc88a687c4d9621" output_with_sei.mp4
SEI信息在专业工作流(如直播推流、后期制作)中很有用
🎨 自定义覆盖物(画中画等)
overlay
滤镜的强大之处在于可以将多个视觉元素(如图片、GIF、甚至另一个视频)以复杂的方式叠加到主视频上。
# 实现画中画效果:将small.mp4缩放后叠加到main.mp4的右下角
ffmpeg -i main.mp4 -i small.mp4 -filter_complex "[1:v] scale=320:240 [pip]; [0:v][pip] overlay=W-w-10:H-h-10" -c:a copy output_pip.mp4
- 添加水印等滤镜处理:使用
-filter_complex
参数,例如ffmpeg -i input.mp4 -i logo.png -filter_complex "overlay=5:5" output.mp4
- 推流:
ffmpeg -re -i input.mp4 -acodec copy -vcodec copy -f flv rtmp://server/address
通过定义复杂的滤镜链,可以实现动态贴纸、片头片尾等高级效果
工具名称 | 核心功能 | 主要特点 |
---|---|---|
ffmpeg |
音视频转码、剪辑、合并、过滤等 | 功能强大,支持大量编解码器和容器格式,是处理操作的核心 |
ffprobe |
分析媒体文件,查看元数据、流信息 | 输出详细媒体信息,支持多种格式(如 JSON),便于脚本分析 |
ffplay |
简单的媒体播放器,用于播放和调试 | 基于 FFmpeg 库的轻量级播放器,支持实时预览和基本播放控制 |
🔍 ffprobe:媒体文件分析专家
ffprobe
用于查看媒体文件的详细信息,基本命令格式是 ffprobe [选项] 输入文件
。
参数类别 | 核心参数示例 | 主要作用 |
---|---|---|
基本信息查看 | -show_format , -show_streams |
显示容器格式、时长、比特率和元数据、流(视频、音频,字幕)的基本信息 ,包括编解码器、分辨率、帧率、采样率等 |
流选择与过滤 | -select_streams |
指定要分析的流类型(如 v:0 表示第一个视频流,a:0 表示第一个音频流,s 表示所有字幕流) |
输出格式控制 | -print_format (-of ) |
设置输出格式(如 json , csv , xml ,default (默认文本格式)),便于机器解析 |
数据详查 | -show_frames , -show_packets |
显示每一帧,帧类型(I帧、P帧、B帧)、时间戳、大小等。注意:输出会非常长或每一个数据包的详细信息,如大小、解码时间戳(DTS)、显示时间戳(PTS)等用于深度分析 |
输出精简控制 | -v error , -hide_banner |
**-v 或 -loglevel :设置日志级别。常用 error (只显示错误)或 quiet (完全不输出日志)减少冗余输出,只显示错误或关键信息,hide_banner **:在启动时不显示FFmpeg的版本、编译配置等欢迎信息,让输出更干净 |
-show_entries
:这是一个非常强大的参数,允许你精确指定要显示哪些字段的值,常与 -of
配合使用以生成简洁的输出,适合在Shell脚本中直接使用
# 只获取视频的宽度和高度,输出格式为 "1920x1080"
ffprobe -v error -select_streams v:0 -show_entries stream=width,height -of csv=s=x:p=0 input.mp4
常见用法:
- 显示基本信息:直接运行
ffprobe input.mp4
,会输出容器格式、时长、比特率、音视频流编码信息等 - 以特定格式输出详细信息:使用
-print_format
(或-of
)参数,如ffprobe -v quiet -print_format json -show_format -show_streams input.mp4
,可以 JSON 格式输出格式和流的详细信息,便于程序解析 - 查询特定信息:使用
-show_entries
,例如获取视频时长ffprobe -v error -show_entries format=duration -of default=noprint_wrappers=1:nokey=1 input.mp4
,或只查看视频流信息ffprobe -select_streams v -show_streams input.mp4
ffprobe 是 FFmpeg 工具集中用于分析多媒体文件的强大工具,可以深入查看视频、音频文件的容器格式、流信息、帧数据等详细信息。下面我将它的核心参数分类说明,并附上典型用例。
为了让你快速把握全貌,这里用一个表格汇总 ffprobe 的主要参数类别和核心选项:
参数类别 | 核心参数示例 | 主要作用 |
---|---|---|
基本信息查看 | -show_format , -show_streams |
显示容器格式、流(视频、音频)的基本信息 。 |
流选择与过滤 | -select_streams |
指定要分析的流类型(如 v:0 表示第一个视频流)。 |
输出格式控制 | -print_format (-of ) |
设置输出格式(如 json , csv , xml ),便于机器解析 。 |
数据详查 | -show_frames , -show_packets |
显示每一帧或每一个数据包的详细信息,用于深度分析 。 |
输出精简控制 | -v error , -hide_banner |
减少冗余输出,只显示错误或关键信息 。 |
💻 常用参数详解与示例
🔍 查看基本信息
这些参数帮助你快速了解媒体文件的整体情况。
**
-show_format
**:输出媒体容器的信息,比如格式、时长、比特率和元数据。
ffprobe -show_format input.mp4
**
-show_streams
**:显示文件中所有流(如视频、音频、字幕)的详细信息,包括编解码器、分辨率、帧率、采样率等。
ffprobe -show_streams input.mp4
🎯 选择特定流
当文件包含多个流时,使用这些参数可以聚焦于你关心的部分。
**
-select_streams
**:通过流指示符选择特定的流。例如,v:0
表示第一个视频流,a:0
表示第一个音频流,s
表示所有字幕流。
# 只查看第一个视频流的信息 ffprobe -select_streams v:0 -show_streams input.mkv
📊 控制输出格式
这些参数对于脚本自动化处理特别有用,可以生成易于程序解析的输出。
**
-print_format
(或-of
)**:指定输出信息的格式。常用的有json
(结构化数据)、csv
(逗号分隔值)、xml
(可扩展标记语言)和default
(默认文本格式)。
# 以JSON格式输出完整的格式和流信息,便于其他程序解析 ffprobe -print_format json -show_format -show_streams input.mp4
-show_entries
:这是一个非常强大的参数,允许你精确指定要显示哪些字段的值,常与-of
配合使用以生成简洁的输出,适合在Shell脚本中直接使用。
# 只获取视频的宽度和高度,输出格式为 "1920x1080" ffprobe -v error -select_streams v:0 -show_entries stream=width,height -of csv=s=x:p=0 input.mp4
🔎 深度数据分析
用于需要分析媒体文件底层结构的高级场景。
-show_frames
:输出每一帧(视频帧、音频帧)的详细信息,包括帧类型(I帧、P帧、B帧)、时间戳、大小等。注意:输出会非常长。
ffprobe -show_frames input.mp4
**
-show_packets
**:显示每个数据包的信息,如大小、解码时间戳(DTS)、显示时间戳(PTS)等。这对于分析流媒体或容器格式问题很有帮助。
🔊 控制输出信息量
让输出结果更清晰,只显示你真正需要的内容。
**
-v
或-loglevel
**:设置日志级别。常用error
(只显示错误)或quiet
(完全不输出日志)来避免不必要的提示信息,尤其是在脚本中。
# 只输出视频的时长(秒),没有其他任何信息 ffprobe -v error -show_entries format=duration -of default=noprint_wrappers=1:nokey=1 input.mp4
**
-hide_banner
**:在启动时不显示FFmpeg的版本、编译配置等欢迎信息,让输出更干净。
🛠️ 实用命令示例
获取视频时长
ffprobe -v error -show_entries format=duration -of default=noprint_wrappers=1:nokey=1 input.mp4
查看视频编码格式和分辨率
ffprobe -v error -select_streams v:0 -show_entries stream=codec_name,width,height,avg_frame_rate -of csv=p=0 input.mp4
检查音频采样率
ffprobe -v error -select_streams a:0 -show_entries stream=sample_rate -of default=noprint_wrappers=1:nokey=1 input.mp3
以JSON格式导出完整媒体信息
ffprobe -v quiet -print_format json -show_format -show_streams input.mp4 > media_info.json
▶️ ffplay:简易播放与调试工具
ffplay`是一个基于 FFmpeg 的轻量级媒体播放器,常用于快速预览或调试
参数类别 | 参数选项 | 含义与功能 |
---|---|---|
基本播放控制 | -ss [time] |
指定从媒体的某个时间点开始播放(例如 00:01:30 或 90 )。 |
-t [duration] |
设置播放的时长(单位:秒)。 | |
-loop [number] |
设置循环播放次数,0 表示无限循环。 |
|
-autoexit |
播放结束后自动退出播放器。 | |
显示设置 | -window_title [title] |
设置播放窗口的标题。 |
-fs |
以全屏模式启动。 | |
-an |
禁用音频(不播放声音)。 | |
-vn |
禁用视频(不播放图像)。 | |
-sn |
禁用字幕。 | |
-nodisp |
关闭图形化显示窗口(视频将不显示,常用于播放纯音频文件)。 | |
-showmode [mode] |
设置显示模式。0 :视频,1 :音频波形,2 :音频频谱。 |
|
流选择与解码 | -ast [index] |
指定播放哪个音频流(例如 -ast 1 )。 |
-vst [index] |
指定播放哪个视频流。 | |
-vcodec [codec] |
强制使用指定的视频解码器(例如 -vcodec h264 )。 |
|
-acodec [codec] |
强制使用指定的音频解码器。 | |
滤镜应用 | -vf [filtergraph] |
设置视频滤镜(例如旋转、缩放、裁剪等)。 |
-af [filtergraph] |
设置音频滤镜(例如调整音量、变速等)。 | |
高级功能 | -sync [type] |
设置音视频同步的主时钟类型(audio , video , ext ),默认为音频同步。 |
-stats |
显示播放统计信息(如帧率、码率等),此选项默认启用。 | |
-volume [vol] |
设置起始音量(范围 0-100) |
精准播放片段
从视频
lecture.mp4
的第10分钟开始,播放10分钟的音频(不播放视频):ffplay -ss 00:10:00 -t 600 -vn lecture.mp4
这里
-ss 00:10:00
指定开始时间,-t 600
指定播放时长(600秒=10分钟),-vn
表示禁用视频,只听声音循环播放与窗口设置
将窗口标题设置为 “产品演示”,并无限循环播放视频
demo.mp4
:ffplay -window_title "产品演示" -loop 0 demo.mp4
-loop 0
实现无限循环应用视频滤镜
播放视频时将其水平翻转:
ffplay -vf "hflip" test.mp4
使用
-vf
参数可以应用丰富的视频滤镜,如缩放 (scale
)、旋转 (transpose
)、裁剪 (crop
) 等应用音频滤镜
以1.5倍速播放音频(视频正常速度):
ffplay -af "atempo=1.5" podcast.mp3
使用
-af
参数调整音频,atempo
滤镜用于改变播放速率播放网络流
播放一个网络直播流:
ffplay -window_title "直播" rtmp://server/app/stream
ffplay 支持多种网络流媒体协议,如 RTMP、HTTP 等
分析音频文件
以音频波形模式播放文件,便于分析音频信号:
ffplay -showmode 1 -nodisp audio.wav
-showmode 1
显示音频波形,-nodisp
不显示视频窗口(因为这是纯音频文件)
⌨️ 播放中的键盘控制
启动播放后,你还可以通过键盘快捷键进行实时控制:
空格键 或 P: 暂停/继续播放
Q 或 ESC: 退出播放
F: 全屏切换
M: 静音切换
S: 逐帧播放
左右箭头: 向后/向前拖动10秒
上下箭头: 向后/向前拖动1分钟
9 或 0: 减小/增加音量
常见操作:
- 播放控制:在播放界面下,可以使用一些快捷键,例如按 空格键 或 P 暂停/继续,按 Q 或 ESC 退出,按 F 切换全屏等
- 指定解码器:可使用
-acodec
、-vcodec
强制指定音视频解码器 - 自动退出:使用
-autoexit
参数可在播放完成后自动退出,适合脚本中使用
💡 如何选择工具
- 当你需要对媒体文件进行转换、编辑、加工时,使用 **
ffmpeg
**。 - 当你需要查看文件详细参数、分析结构、排查问题时,使用 **
ffprobe
**。 - 当你需要快速预览效果、测试播放或简单调试时,使用
ffplay
网站:
https://www.metools.info/other/audiojoin284.html