FFmpeg使用


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, xmldefault(默认文本格式)),便于机器解析
数据详查 -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的版本、编译配置等欢迎信息,让输出更干净

🛠️ 实用命令示例

  1. 获取视频时长

    ffprobe -v error -show_entries format=duration -of default=noprint_wrappers=1:nokey=1 input.mp4
    
  2. 查看视频编码格式和分辨率

    ffprobe -v error -select_streams v:0 -show_entries stream=codec_name,width,height,avg_frame_rate -of csv=p=0 input.mp4
    
  3. 检查音频采样率

    ffprobe -v error -select_streams a:0 -show_entries stream=sample_rate -of default=noprint_wrappers=1:nokey=1 input.mp3
    
  4. 以JSON格式导出完整媒体信息

    ffprobe -v quiet -print_format json -show_format -show_streams input.mp4 > media_info.json
    

▶️ ffplay:简易播放与调试工具

ffplay`是一个基于 FFmpeg 的轻量级媒体播放器,常用于快速预览或调试

参数类别 参数选项 含义与功能
基本播放控制 -ss [time] 指定从媒体的某个时间点开始播放(例如 00:01:3090)。
-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] 设置音视频同步的主时钟类型(audiovideo, ext),默认为音频同步。
-stats 显示播放统计信息(如帧率、码率等),此选项默认启用。
-volume [vol] 设置起始音量(范围 0-100)
  1. 精准播放片段

    从视频 lecture.mp4的第10分钟开始,播放10分钟的音频(不播放视频):

    ffplay -ss 00:10:00 -t 600 -vn lecture.mp4
    

    这里 -ss 00:10:00指定开始时间,-t 600指定播放时长(600秒=10分钟),-vn表示禁用视频,只听声音

  2. 循环播放与窗口设置

    将窗口标题设置为 “产品演示”,并无限循环播放视频 demo.mp4

    ffplay -window_title "产品演示" -loop 0 demo.mp4
    

    -loop 0实现无限循环

  3. 应用视频滤镜

    播放视频时将其水平翻转:

    ffplay -vf "hflip" test.mp4
    

    使用 -vf参数可以应用丰富的视频滤镜,如缩放 (scale)、旋转 (transpose)、裁剪 (crop) 等

  4. 应用音频滤镜

    以1.5倍速播放音频(视频正常速度):

    ffplay -af "atempo=1.5" podcast.mp3
    

    使用 -af参数调整音频,atempo滤镜用于改变播放速率

  5. 播放网络流

    播放一个网络直播流:

    ffplay -window_title "直播" rtmp://server/app/stream
    

    ffplay 支持多种网络流媒体协议,如 RTMP、HTTP 等

  6. 分析音频文件

    以音频波形模式播放文件,便于分析音频信号:

    ffplay -showmode 1 -nodisp audio.wav
    

    -showmode 1显示音频波形,-nodisp不显示视频窗口(因为这是纯音频文件)

⌨️ 播放中的键盘控制

启动播放后,你还可以通过键盘快捷键进行实时控制:

  • 空格键P: 暂停/继续播放

  • QESC: 退出播放

  • F: 全屏切换

  • M: 静音切换

  • S: 逐帧播放

  • 左右箭头: 向后/向前拖动10秒

  • 上下箭头: 向后/向前拖动1分钟

  • 90: 减小/增加音量

常见操作:

  • 播放控制:在播放界面下,可以使用一些快捷键,例如按 空格键P 暂停/继续,按 QESC 退出,按 F 切换全屏等
  • 指定解码器:可使用 -acodec-vcodec强制指定音视频解码器
  • 自动退出:使用 -autoexit参数可在播放完成后自动退出,适合脚本中使用

💡 如何选择工具

  • 当你需要对媒体文件进行转换、编辑、加工时,使用 **ffmpeg**。
  • 当你需要查看文件详细参数、分析结构、排查问题时,使用 **ffprobe**。
  • 当你需要快速预览效果、测试播放或简单调试时,使用 ffplay

网站:

https://www.metools.info/other/audiojoin284.html

https://convertio.co/zh/

https://mp3cut.net/cn/

https://audio.worthsee.com/convert/M4A-to-MP3

https://ezgif.com/video-to-gif?err=expired


文章作者: 读序
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 读序 !
  目录