FFmpeg

文档开始

文档目录开始

快速上手

本页示例全部取自 FFmpeg 官方页面(ffmpeg、filters 手册与官网首页),每条命令都保持官方原文,示例后的解释为中文说明。完整选项表请见 ffmpeg 官方手册,先按 下载页面 装好 ffmpeg 再往下读。

命令基本结构

ffmpeg 是一个通用媒体转换器:它可以读取任意数量的输入(普通文件、管道、网络流、采集设备等),每个输入用 -i 指定;输出则是命令行里任何无法解释为选项的裸 URL。规则如下(来自官方 Description 一节):

  • 输入输出中的文件与流都按 0 起的索引引用,例如 2:3 指第三个输入或输出的第四个流。
  • 一般来说,选项作用于其后紧跟的那个文件,因此顺序很重要;请先写完所有输入,再写输出,不要把输入和输出混在一起。
  • 全局选项(例如日志级别)应当最先给出。

格式转换

把输入媒体文件转码为另一种格式(重新编码音视频流)。转码时 ffmpeg 会自动挑选合理的默认编码器与参数:

ffmpeg -i input.avi output.mp4

官网首页给出的同款示例,把 MP4 转成 AVI:

$ ffmpeg -i input.mp4 output.avi

不重编码,只换封装(流复制)

输入格式与输出容器兼容时,用 -c copy 直接复制流,不重新编码,速度快且无损。-map 0:1 表示选取第一个输入的第二个流:

ffmpeg -i INPUT.mkv -map 0:1 -c copy OUTPUT.mp4

也可以把一个 MKV 的视频和一条外部 AAC 音轨混在一起:

ffmpeg -i INPUT0.mkv -i INPUT1.aac -map 0:0 -map 1:0 -c copy OUTPUT.mp4

抽取音频或指定流

一个输入文件里有两条音频流时,它们分别记为 0:00:1。下面的命令把输入的第二个流映射为 out.wav 中唯一的输出流,即"抽取第二条音轨":

ffmpeg -i INPUT -map 0:1 out.wav

映射全部流、或按语言挑选,也是 -map 的常见用法(详见官方手册 Stream selection 一节)。

截取片段

官方的按时间截取示例来自 trim(视频)与 atrim(音频)滤镜。下面两条分别表示"只保留输入的第二分钟"和"只保留第一秒":

ffmpeg -i INPUT -vf trim=60:120
ffmpeg -i INPUT -vf trim=duration=1

更常用的做法是直接给 ffmpeg 传时间位置选项:-ss position 放在 -i 之前表示在输入文件中定位到该时间(seek),放在输出 URL 之前则表示解码并丢弃直到时间戳到达该位置;-to position 在该时间点停止读取输入或写出输出。position 都是 ffmpeg-utils 的时间时长格式(如 55200ms12:03:45,见 通用语法)。

改分辨率与帧率

scale 滤镜把视频缩放到 640x360:

ffmpeg -i infile -vf scale=640:360 outfile

强制输出文件帧率为 24 fps:

ffmpeg -i input.avi -r 24 output.mp4

把原始格式的输入按 1 fps 读入、输出为 24 fps(-r 放在 -i 之前只对流格式输入有效,可能需要 -f 显式指定输入格式):

ffmpeg -r 1 -i input.m2v -r 24 output.mp4

压制体积(控制码率)

把输出的视频码率设为 64 kbit/s:

ffmpeg -i input.avi -b:v 64k -bufsize 64k output.mp4

强制 CBR(恒定码率)输出的官方示例:

ffmpeg -i myfile.avi -b 4000k -minrate 4000k -maxrate 4000k -bufsize 1835k out.m2v

码率数值支持 k 等 SI 前后缀写法,参见 通用语法 的表达式求值一节。

拼接多个文件

官方 FAQ 与 filters 手册给出三种拼接途径:concat 滤镜、concat 解流器(demuxer,可免去重编码)、concat 协议(文件级)。concat 滤镜的官方示例,把片头、正片、片尾拼成一个双语版本(视频在流 0,两条音频在流 1、2):

ffmpeg -i opening.mkv -i episode.mkv -i ending.mkv -filter_complex \
  '[0:0] [0:1] [0:2] [1:0] [1:1] [1:2] [2:0] [2:1] [2:2]
   concat=n=3:v=1:a=2 [v] [a1] [a2]' \
  -map '[v]' -map '[a1]' -map '[a2]' output.mkv

文件级拼接的官方 FAQ 示例(先转成允许直接拼接的中间 MPEG 文件):

ffmpeg -i concat:"intermediate1.mpg|intermediate2.mpg" -c copy intermediate_all.mpg

使用 concat 滤镜时所有片段必须从时间戳 0 开始,且除帧率外的各项参数(如分辨率)需要用户显式统一到一致。

生成 GIF

官方推荐两步法(palettegen / paletteuse 滤镜):先从视频生成调色板图片,再用该调色板输出 GIF:

ffmpeg -i input.mkv -vf palettegen palette.png
ffmpeg -i input.mkv -i palette.png -lavfi paletteuse output.gif

推流基础

官方新闻页给出的简易 HTTP 流示例:以 -listen 1 让 ffmpeg 作为 HTTP 服务端输出 Matroska 流,用 x264 低延迟预设编码采集设备 /dev/video0

ffmpeg -i /dev/video0 -listen 1 -f matroska \
-c:v libx264 -preset fast -tune zerolatency http://:8080

播放端直接用 ffplay 拉流:

ffplay http://localhost:8080/

下一步