文章目录
FFMPEG命令行语法格式FFMPEG的部分关键概念FFMPEG多媒体编解码流程流拷贝(stream copy)模式滤镜(filter)滤镜图(filtergraph)流(stream)自动流选择流限定符(stream specifier)选项时间长度(duration)表示 FFMPEG命令行的常见应用整理帮助查询类流选择示例容器格式及编码转换·音视频封装与提取单纯的格式转换音视频合成指定流的提取音视频流的编码转换特殊软件的编码要求音乐视频的制作 音视频参数设置时间控制滤镜·字幕渲染滤镜·实用视频操作广义视频源·录屏直播简记FFMPEG的部分关键概念,整理常用命令行手册以备查找。本文并非严格的学术文章,部分词汇按个人标准翻译,请认准英文。
FFMPEG命令行语法格式
ffmpeg [global_options] {[input_file_options] -i input_url} ... {[output_file_options] output_url} ...
FFMPEG的部分关键概念
FFMPEG多媒体编解码流程
输入解复用(demux)调用demuxer读取输入文件并获得数据包解码(decode)解码器产生未压缩帧(原始视频/PCM音频等)滤镜处理(filtering)使用滤镜处理未压缩数据编码(encode)混流(mux)后输出以上功能单元(解复用器、混流器、编解码器、滤镜)由以下库提供,可查看相关文档或命令行帮助以获得全部名单及使用方式:
libavcodeclibavformatlibavdevicelibavfilter
流拷贝(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
选项时自动应用该种流选择方案,其步骤为:
检查输出文件格式,确定合法的流类型对于所有合法的流类型,从全部输入文件的流中对VAS各选择一条流,原则为
- 视频流:分辨率最高
- 音频流:声道最多
- 字幕流:第一条,但是须符合输出文件格式要求的字幕类型(基于文本或图像)
- 数据或附加流:无法自动选择,必须使用-map选项指定满足选择标准的所有流中选择索引最小的那条
流限定符(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# 寻找滤镜concatffmpeg -filters | findstr concat
流选择示例
对于如下三份文件
input file 'A.avi'stream 0: video 640x360stream 1: audio 2 channelsinput file 'B.mp4'stream 0: video 1920x1080stream 1: audio 2 channelsstream 2: subtitles (text)stream 3: audio 5.1 channelsstream 4: subtitles (text)input file 'C.mkv'stream 0: video 1280x720stream 1: audio 2 channelsstream 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
指定流的提取
如特定的无声视频、音频流、字幕流、章节信息的提取均可实现
# 强制音频提取并封装为wavffmpeg -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
音视频参数设置
可设置视频的比特率、帧率
# 设置输出视频的比特率为64kbpsffmpeg -i input.avi -b:v 64k -bufsize 64k output.avi# 强制输出24fps帧率ffmpeg -i input.avi -r 24 output.avi# 强制输入的帧率为1fps(仅对原始格式生效)输出帧率为24fpsffmpeg -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.5sffmpeg -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:3OUTPUTffmpeg -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