【FFMPEG笔记·命令行手册】部分关键概念及常用命令行整理

本文详细介绍了FFMPEG命令行工具的关键概念,包括多媒体编解码流程、流拷贝模式、滤镜和滤镜图、流选择等。同时,整理了FFMPEG的常见应用,如格式转换、音视频封装与提取、参数设置、时间控制、滤镜操作以及录屏直播等,帮助用户更好地理解和运用FFMPEG进行音视频处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


简记FFMPEG的部分关键概念,整理常用命令行手册以备查找。本文并非严格的学术文章,部分词汇按个人标准翻译,请认准英文。

FFMPEG命令行语法格式

ffmpeg [global_options] {[input_file_options] -i input_url} ... {[output_file_options] output_url} ...

FFMPEG的部分关键概念

FFMPEG多媒体编解码流程

FFmpeg多媒体编解码流程

  1. 输入解复用(demux)调用demuxer读取输入文件并获得数据包
  2. 解码(decode)解码器产生未压缩帧(原始视频/PCM音频等)
  3. 滤镜处理(filtering)使用滤镜处理未压缩数据
  4. 编码(encode)
  5. 混流(mux)后输出

以上功能单元(解复用器、混流器、编解码器、滤镜)由以下库提供,可查看相关文档或命令行帮助以获得全部名单及使用方式:

流拷贝(stream copy)模式

-codec[:stream_specifier] copy指定。若指定流拷贝模式,则跳过编解码与滤镜操作(当然亦无法执行滤镜处理操作),仅执行解复用与混流步骤,常用于修改容器格式或修改容器元数据。优势在于快速、无质量损失。

滤镜(filter)

也译为过滤器,是FFMPEG对各种未压缩流数据操作的基本功能单元的抽象。滤镜为逐流(per-stream)作用,需以流限定符(stream specifier)指定操作对象流。从作用对象分类,滤镜有视频滤镜V、音频滤镜A与字幕滤镜S之分(VAS)。从功能分类,滤镜可分为功能滤镜(filter)、源(source)、汇(sink),后二者可理解为FFMPEG自身提供的输入与输出文件。

滤镜图(filtergraph)

若干(或单一)滤镜链式连接形成的可用图表示其逻辑组合的功能单元,简单地理解为所有应用的滤镜的统称。以输入输出流数或流类型异同可区分两种滤镜图:简单(simple)滤镜图与复杂滤镜图,二者诸多方面有差异。

流(stream)

多媒体容器文件的基本单元,也是FFMPEG的基本处理对象,滤镜与编解码器应用的最小单位。在各种应用场景中,流常被封装于容器文件中,解复用步骤实际就是拆封从而拿到流。流有视频流、音频流、字幕流之分(VAS)。

自动流选择

流选择(stream selection)的一种(另一种是手动流选择,由map选项指定)。输出文件无map选项时自动应用该种流选择方案,其步骤为:

  1. 检查输出文件格式,确定合法的流类型
  2. 对于所有合法的流类型,从全部输入文件的流中对VAS各选择一条流,原则为
    - 视频流:分辨率最高
    - 音频流:声道最多
    - 字幕流:第一条,但是须符合输出文件格式要求的字幕类型(基于文本或图像)
    - 数据或附加流:无法自动选择,必须使用-map选项指定
  3. 满足选择标准的所有流中选择索引最小的那条

流限定符(stream specifier)

对于逐流(per-stream)操作的选项,使用流限定符指定作用的对象流。流限定符的形式为附加于选项名后以分号隔开的字符串,具体形式如下:

  • stream_index
  • stream_type[:additional_stream_specifier]
  • p:program_id[:additional_stream_specifier]
  • #stream_id(i:stream_id)
  • m:key[:value]
  • u

选项

指定参数、选择滤镜、限定对象…选项是FFMPEG命令行的基础。大致分为:

  • 通用选项(Generic options)
  • 主选项(Main options)
  • VAS选项
  • 额外的高级选项(Advanced options)

了解选项需关注以下方面:

  • 最小作用域(Least Range)全局G·输入输出文件F·逐流S
  • 输入?输出?(IO)
  • 参数
  • 功能

时间长度(duration)表示

libavutil库提供支持,建议查看官方文档。总的来说有两种表示方法:

[-][HH:]MM:SS[.m...]
[-]S+[.m...][s|ms|us]

FFMPEG命令行的常见应用整理

帮助查询类

以下命令测试环境为CMD(chcp 65001),PowerShell环境需对复杂滤镜图的-filter_complex选项的参数值两侧加引号

# 命令行帮助文档
ffmpeg -h long
# 寻找帮助条目中含字符wma的编解码器
ffmpeg –codecs | findstr wma
# 寻找帮助条目中含字符mkv的格式·容器
ffmpeg –formats | findstr mkv
# 寻找滤镜concat
ffmpeg -filters | findstr concat

流选择示例

对于如下三份文件

input file 'A.avi'
      stream 0: video 640x360
      stream 1: audio 2 channels

input file 'B.mp4'
      stream 0: video 1920x1080
      stream 1: audio 2 channels
      stream 2: subtitles (text)
      stream 3: audio 5.1 channels
      stream 4: subtitles (text)

input file 'C.mkv'
      stream 0: video 1280x720
      stream 1: audio 2 channels
      stream 2: subtitles (image)

思考以下的命令会对哪些流产生作用

# 自动流选择
ffmpeg -i A.avi -i B.mp4 out1.mkv out2.wav -map 1:a -c:a copy out3.mov
# 自动字幕选择
ffmpeg -i C.mkv out1.mkv -c:s dvdsub -an out2.mkv
# 无标签滤镜图输出
ffmpeg -i A.avi -i C.mkv -i B.mp4 -filter_complex "overlay" out1.mp4 out2.srt
# 标签式滤镜图输出
ffmpeg -i A.avi -i B.mp4 -i C.mkv -filter_complex "[1:v]hue=s=0,split=2[outv1][outv2];overlay;aresample" \
        -map '[outv1]' -an        out1.mp4 \
                                  out2.mkv \
        -map '[outv2]' -map 1:a:0 out3.mkv

容器格式及编码转换·音视频封装与提取

不涉及编码转换的容器转换较简单,只需注意流选择(直接流拷贝亦可)即可实现容器格式转换、多个音视频文件的封装及指定流的提取

单纯的格式转换

可以指定流拷贝模式对视频、字幕进行快速的格式转换

# 快速视频封装格式转换
ffmpeg –i input.mkv –c copy output.mp4
# 字幕格式转换
ffmpeg –i in.ass out.srt
音视频合成
# 快速合成有声视频
ffmpeg -i AUDIO -i VIDEO_NOAUDIO -c copy OUTPUT
# 为mkv文件加软字幕
ffmpeg –i input.mp4 –i hello.srt output.mkv
# mkv容器的合成
ffmpeg -i A.mp3 -i V.mp4 -i S.srt -c copy output.mkv
指定流的提取

如特定的无声视频、音频流、字幕流、章节信息的提取均可实现

# 强制音频提取并封装为wav
ffmpeg -i INPUT -map 0:a -c:a copy -f wav OUTPUT.wav
# 截取部分音频
ffmpeg -i INPUT -map 0:a -c:a copy –ss START –t DURATION OUTPUT
# 提取无声视频
ffmpeg –i INPUT –map 0:v –c:v copy OUTPUT
# 提取章节信息
ffmpeg –i INPUT –f ffmetadata METADATA.txt 

若转换容器的同时需转换编码,则可以实现对多媒体文件编码的几乎绝对控制,还可利用容器实现一些特殊的操作

音视频流的编码转换
# 音频编码转换
ffmpeg -i INPUT -c:a aac OUTPUT.mp3
# 综合性音视频编码转换·流选择·指定编解码器·限定码率
ffmpeg -vcodec wmv3 -acodec wmav2 –i INPUT.wmv -map 0:v -vcodec libx264 -b:v 6000k -map 0:a -acodec mp3 -b:a 320k OUTPUT.mp4
特殊软件的编码要求

PR 等剪辑软件对于导入文件的格式有严格要求(不支持mkv的导入,某些视频编码格式及像素格式也不接受),可以利用编码及容器转换满足其导入要求

# 编码暨格式转换(适配mkv文件的PR导入)可在此基础添加对码率的调整以减少视频的质量损失
ffmpeg -i input.mkv -c:v libx264 –pix_fmt yuv420p -c:a aac output.mp4
音乐视频的制作

利用loop选项可以实现音频与图片合成视频(歌曲配图片的视频)

ffmpeg -r 2 -loop 1 -i IMG -i MUSIC -s 1080*720 -pix_fmt yuv420p -shortest -c:v libx264 -c:a aac OUTPUT.mp4

音视频参数设置

可设置视频的比特率、帧率

# 设置输出视频的比特率为64kbps
ffmpeg -i input.avi -b:v 64k -bufsize 64k output.avi
# 强制输出24fps帧率
ffmpeg -i input.avi -r 24 output.avi
# 强制输入的帧率为1fps(仅对原始格式生效)输出帧率为24fps
ffmpeg -r 1 -i input.m2v -r 24 output.avi

可设置音频的比特率、采样率、声道数

时间控制

利用通用选项中的时间控制选项可以实现对多媒体文件的裁剪或延迟

# 视频片段截取30s-1min片段
ffmpeg -i INPUT -max_muxing_queue_size 1024 –c copy -ss 30 -t 1:00 OUTPUT
# 音频整体延迟0.5s
ffmpeg -i INPUT -map 0:a -itsoffset 0.5 -map 0:v -c:v copy OUTPUT

滤镜·字幕渲染

# 为视频文件加硬字幕
ffmpeg –i input.mp4 –vf subtitles=sub.ass output.mp4

滤镜·实用视频操作

使用滤镜可以实现对视频的缩放、裁剪、旋转、拼接、倍速播放、加水印等操作

# 改变4K60fps视频的分辨率与帧率同时尽量保持画质
ffmpeg -i 4K60fpsINPUT -vf scale=1920:-1 –r:v 24 –vb 6000k -acodec copy 1080p24fpsOUTPUT
# 将16:9长宽比视频的纵横比改为4:3,同时改变分辨率,可能失真
ffmpeg -i 16:9INPUT -vf scale=960:720,setdar=4/3 -acodec copy 4:3OUTPUT
ffmpeg -i 16:9INPUT -vf scale=960:720,setsar=1:1 -acodec copy 4:3OUTPUT
# 视频的时间(30s至1min)与空间裁剪(坐标(12,34)处的100x100像素大小的图像)
ffmpeg -i INPUT -vf crop=100:100:12:34 -ss 30 -t 30 OUTPUT
# 右上贴图或加水印
ffmpeg -i INPUT -i logo.png -filter_complex overlay=W-w:0 OUTPUT
# 跑马灯(将duration替换为相应的时间)
ffmpeg -i INPUT -i IMG -filter_complex [0:v][1:v]overlay=x='if(lte(t,duration),-w+(W+w)/2/duration*t,(W-w)/2)':y=(H-h)/2 -t duration OUTPUT
# 准确连接音视频
ffmpeg -t 00:00:05.90 -i INPUT -t 00:01:57.80 -i INPUT -filter_complex [0:0][1:0]concat=n=2:v=0:a=1[outa] -map [outa] -b:a 320k OUTPUT
# 音视频2倍速播放
ffmpeg -i INPUT –filter_complex [0:v]setpts=2.0*PTS[v],[0:a]atempo=0.5[a] –map [v] –map [a] OUTPUT

广义视频源·录屏直播

实际上,输入输出文件不仅可为本地多媒体文件,也可为设备源(如屏幕,需提前安装设备驱动)甚至互联网URL,由此便可实现本地录屏、直播推流与录制、下载m3u8流媒体文件等多种操作

# 录屏
ffmpeg -f dshow -rtbufsize 800M -framerate 25 -i video=VIDEO_DEV -f dshow -rtbufsize 60M -i audio=AUDIO_DEV1 -f dshow -rtbufsize 60M -i audio=AUDIO_DEV2 -filter_complex amix=inputs=2 -pix_fmt yuv420p -c:v h264 -c:a pcm_s16le -s 1920*1080 -b:v 2200k -preset ultrafast 录屏文件地址
# 直播推流屏幕
ffmpeg -f gdigrab -i desktop -f dshow -i audio=AUDIO_DEV0 -r 20 -vcodec libx264 -preset ultrafast -acodec aac -ac 2 -ar 44100 -ab 128k -pix_fmt yuv420p -f flv 推流目的地址
# 直播录制
ffmpeg -i 直播源 OUTPUT
# 直播录制1小时
ffmpeg -t 01:00:00.00 -i 直播源 OUTPUT
# 下载m3u8流视频
ffmpeg –i URL.m3u8 –c copy OUTPUT

其实,滤镜中的源(source)也可以产生不同的音视频以供多种目的

# 裁剪99s的计时器
ffmpeg -ss 00:00:01 -t 99 -f lavfi -i testsrc -vf crop=61:52:224:94 timer.mp4
# 为图片或视频配置绿幕背景
ffmpeg -i INPUT -vf color=c=green:s=480x360[bgd];[bgd][0:v]overlay=(W-w)/2:(H-h)/2 -t 10000ms OUTPUT
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值