FFmpeg 参数详解(二)
https://blog.csdn.net/yizhizouxiaqu/article/details/52233673
5、参数选项
如果没有特殊声明,所有的数字参数都以一个字符串代表数字的形式作为输入参数接收,所有的数字参数都会带着一个SI前缀单位,例如’K’, ’M’或者’G’。
如果 ‘i’被追加到SI的首字母,完整的字母会被当做i的二进制倍数解释,倍数需要乘以1024,而不是乘以1000。追加 ‘B’到SI单位的前面倍数是8。下面几个参数的用法都是作为数字的后缀,例如’KB’,’MiB’,’G’和’B’。
没有设置值为ture的boolean类型的参数。boolean类型的false可以在选项前面加上”no”来表示。例如使用 “-nofoo”会设置”foo”参数为boolean类型的false。
5.1、流的详细说明
一些选项是被应用到单个流上的,例如码率和编码。流的详情参数被用来精确的控制参数属于哪个流。
流的说明通常是被追加到选项名字后面并且用分号分开的一个字符串。例如:-codec:a:1 ac3包含了 a:1 流声明符,这个参数是来匹配第二个音频流的。因此,音频流将会选择ac3编码作为第二个音频流。
一个流声明符可以匹配几个流,因此参数选项是被用到所有流上的。例如 -b:a 128k 参数,匹配所有的音频流。
空的流声明匹配所有的流上。例如,-codec copy 或者 -codec:copy 会复制所有不需要再次编码的流。
可能的流参数如下所示:
stream_index
根据索引去匹配流。例如: -threads:1 4 将会为第二个流设置4个线程处理。
stream_type[:stream_index]
stream_type针对视频可以选择’v’或’V’其中一个参数表示,针对音频的参数是’a’表示,针对字幕的参数是’s’表示,针对数据的参数为’d’表示,针对附件的参数为’t’表示。用 ‘v’匹配所有的视频流,用’V’仅仅匹配没有附加图片、视频缩略图或者封面的视频流。如果提供了stream_index,stream_type会根据stream_index去匹配视频流。否则,stream_type会匹配所有的视频流。
p:program_id[:stream_index]
如果提供了stream_index,program_id的程序去匹配对应stream_index的视频流。否则在程序中会匹配所有的视频流。
#stream_id or i:stream_id
根据流id匹配对应的流(例如在MPEG-TS容器中的PID)。
m:key[:value]
用元数据中带有key=value的ag去匹配流。如果value没有声明,会匹配此tag的任何流。
u
用可用的配置匹配流,编码必须被定义,并且例如视频尺寸或者音频采样率等必要的信息必须提供。
注意在ffmpeg中,根据元数据匹配仅仅会在输入的文件起作用。
5.2、通用参数
以ff*开始的工具都可以使用下面的参数。
-L
显示授权信息
-h, -?, -help, —help [arg]
显示帮助信息。可以根据一个特定的可选参数来打印具体的帮助信息。如果没有参数声明,仅仅展示基本的工具参数信息。
可能的参数值为:
long
打印除基本工具选项外的高级工具选项。
full
打印完整的选项列表,包括编码、解码、解封装、封装,过滤器等私有的或共享的选项。
decoder=decoder_name
打印解码器名字为decoder_name的详细信息。使用-decoders选项会打印所有解码器列表。
encoder=encoder_name
打印编码器名字为encoder_name的详细信息。使用-encoders选项会打印所有编码器列表。
demuxer=demuxer_name
打印解封装器名字为demuxer_name的详细信息。使用-formats选项会打印所有解封装器和封装器的列表。
muxer=muxer_name
打印封装器名字为muxer_name的详细信息。使用-formats选项会打印所有解封装器和封装器的列表。
filter=filter_name
打印名字为filter_name的过滤器详细信息。使用-filters选项会打印过滤器的列表。
-version
展示ffmpeg版本
-formats
展示可以使用的格式(包括设备)。
-devices
展示所有可用的设备。
-codecs
展示所有已知的libavcodec。
注意在整个文档中都使用了术语’codec’作为二进制流媒体格式的简称。
-decoders
展示所有可用的解码器。
-bsfs
展示所有可用的码流过滤器。
-protocols
展示所有可用的协议。
-filters
展示可用的libavfilter过滤器
-pix_fmts
展示可用的像素格式
-sample_fmts
展示可用的采样格式
-layouts
展示视频流的信道名称和布局。
-colors
展示注册的颜色名称
-sources device[,opt1=val1[,opt2=val2]…]
展示可自动识别的输入设备的源。一些提设备供了可能探测不到的源的名字。返回的列表通常不是完整的。
<span style="white-space:pre"> </span>ffmpeg -sources pulse,server=192.168.0.4
-sinks device[,opt1=val1[,opt2=val2]…]
显示自动探测到接收器的输出设备。一些提设备供了可能探测不到的源的名字。因此返回的列表是不完整的。
<span style="white-space:pre"> </span>ffmpeg -sinks pulse,server=192.168.0.4
-loglevel [repeat+]loglevel | -v [repeat+]loglevel
设置library使用的日志级别。增加’repeat+’说明日志的输出不会被压缩到第一行,并且会删除”Last message repeated n times”。”repeat”也可以独立使用。如果 “repeat”独立使用,并且没有设置日志的等级,就会使用默认的日志等级。如果给出了多个日志的等级参数,使用”repeat”将不会改变日志级别。日志级别是如下所示的一个字符串或者数字。
‘quiet, -8’
不会显示任何信息
‘panic, 0’
仅仅展示可能导致进程崩溃的致命错误,例如段错误。这个目前还没有什么用。
‘fatal, 8’
仅仅展示致命错误。如果出现错误进程将不会继续执行。
‘error, 16’
展示所有的错误,包括不能恢复的错误。
‘warning, 24’
展示所有的警告和错误。任何可能不对或不期望的事件都会被展示出来。
‘info, 32’
展示处理过程中的信息。包含了警告和错误信息。这个是默认值。
‘verbose, 40’
同“info”类似,增加了更多的冗余信息。
‘debug, 48’
展示了包含调试的所有信息。
‘trace, 56’
程序默认输出log到标准输出,如果输出终端支持颜色展示,错误和警告会被用带有颜色的字体展示出来。日志颜色可以通过设置AV_LOG_FORCE_NOCOLOR或NO_COLOR,或者设置系统变量AV_LOG_FORCE_COLOR禁用掉。系统变量 NO_COLOR 已经被废弃了,并且在下一个版本中删除。
-report
转存完整的命令行和控制台的输入到当前目录的一个program-YYYYMMDD-HHMMSS.log的日志。这个文件也能用来记录bug报告。也可以使用 -loglevel verbose参数。
设置 FFREPORT 这个环境变量为任何值都会有同样的效果。如果这个值是用 ‘:’ 分割的key=value序列,这些值也会影响报告;如果包含特别的字符或者 ‘:’分割符,这些参数值必须被转译(请看ffmpeg-utils手册的 “引用和转译”一章)。
可以使用以下参数值:
file
为报告设置名字; %p是程序名字的扩展,%t是时间戳的扩展,%%是%的扩展。
level
使用数字(看 -loglevel)设置日志的冗余级别。
例如,使用日志级别32(别名为r日志级别 info)输出报告到名字为ffreport.log的日志上。
<span style="white-space:pre"> </span>FFREPORT=file=ffreport.log:level=32 ffmpeg -i input output
若果在环境变量的解析过程中出现错误并非是致命的,在报告中也不会出现的。
-hide-banner
不打印版权标志。
所有的ffmpeg 工具都会正常展示一个版权声明,编译选项和库的版本。这个可选的参数用来控制打印这个信息。
-cpuflags flags (global)
允许设置和清除cpu标志。这个选项是用来测试的。除了你知道你正在使用这个选项改什么外请不要使用这个选项。
<span style="white-space:pre"> </span>ffmpeg -cpuflags -sse+mmx ...
<span style="white-space:pre"> </span>ffmpeg -cpuflags mmx ...
<span style="white-space:pre"> </span>ffmpeg -cpuflags 0 ...
此选项的可能值为:
'x86'的机器为:‘mmx’,‘mmxext’,‘sse’,‘sse2’,‘sse2slow’,‘sse3’,‘sse3slow’,‘ssse3’,‘atom’,‘sse4.1‘,‘sse4.2’,‘avx’,‘avx2’,‘xop’,‘fma3’,‘fma4’,‘3dnow’,‘3dnowext’,‘bmi1’,‘bmi2’,‘cmov’
’ARM‘的机器为:‘armv5te’,‘armv6’,‘armv6t2’,‘vfp’,‘vfpv3’,‘neon’,‘setend’
'AArch64'的机器为:‘armv8’,‘vfp’,‘neon’
‘PowerPC’的机器为:‘altivec’
‘Specific Processors’的机器为:‘pentium2’,‘pentium3’,‘pentium4’,‘k6’,‘k62’,‘athlon’,‘athlonxp’,‘k8’
-opencl_bench
这个选项是用来所有可使用的OpenCL设备基准测试并且打印结果。只有当FFmpeg用—enable-opencl编译时才可以使用这个选项。
当FFmpeg是通过—enable-opencl配置编译时,全局OpenCL上下文选项设置通过-opencl_options设置的。阅读在ffmpeg-utils手册中”OpenCL Options”一节,有关于这个选项完整的支持列表。另外,这些选项包含选择一个特定平台和设备运行OpenCL代码的能力。默认的,FFmpeg会运行第一个平台上的第一个设备。尽管全局的OpenCL上下文选项为用户提供了选择OpenCL设备的灵活性,但是大多数用户都可能为他们的系统选择最快的OpenCL设备。
这个选项根据用户的系统识别有效的设备来帮助用户做最有效配置的选择。内在的基准测试运行在所有的OpenCL设备上,并且性能是根据每个设备衡量的。在结果列表中的设备首先是根据最快设备的性能排序的。用户随后可以通过使用-opencl_options去获得最佳性能OpenCL加速代码调用 ffmpeg。
使用OpenCL设备加速的典型用法步骤如下
运行命令:
<span style="white-space:pre"> </span>ffmpeg -opencl_bench
记录下在列表中最快设备的平台ID(pidx)和设备ID(didx)。使用下面的命令选择平台和设备:
<span style="white-space:pre"> </span>ffmpeg -opencl_options platform_idx=pidx:device_idx=didx
-opencl_options options (global)
设置OpenCL的环境变量。这个选项当且仅当ffmpeg使用了 —enable_opencl编译。
选项必须是用 ‘:’分割的key=value列表。详情见ffmpeg-utils手册的”OpenCL Options”一节。
5.3 AVOptions
这些选项是由libavformat,libavdevice和libavcodec这3个库直接提供的。因此使用-help选项可以查看AVOptions的参数列表。这些参数列表分为2类:
generic
这些选项可以为任何容器、编码器和设备设置。通用选项在容器/设备的AVFormatContext选项下和编码器的AVCodecContext选项下被列出。
private
这些选项是为特殊的容器、编码器和设备特有。私有选项在容器/设备/编码器下被列出。
例如把一个mp3文件的头由默认的ID3v2.4替换为ID3v2.3。(ID3详见 https://en.wikipedia.org/wiki/ID3):
<span style="white-space:pre"> </span>ffmpeg -i input.flac -id3v2_version 3 out.mp3
所有的AVOptions编码器是针对每个流的,因此流说明应该附加到编码器上。
注意:-nooption语法不能使用布尔值,使用-option 0或-option 1来代替。
注意:旧的没有文件声明的在每个流前面加v/a/s的AVOptions已经过时并会被删除。
5.4 主要选项
-f fmt (input/output)
强制输入或输出文件的格式。通常输入文件的格式被自动检测,输出文件的格式根据输出文件的扩展名进行推测,因此多数情况下是不需要这个选项的。
-i filename (input)
输入文件的名字
-y (global)
不需要询问覆盖输出文件
-n (global)
不会覆盖输出文件,如果输出文件已经存在程序立即退出。
-stream_loop number (input)
设置输入流被循环的次数。循环0次意味着没有循环,循环-1意味着无限循环。
-c[:stream_specifier] codec (intput/output,per-stream)
-coedc[:stream_specifier] codec (intput/output,per-stream)
为一个或多个流选择一个编码器(当用在输出文件的前面时)或一个解码器(当使用在输入文件的前面时)。codec是一个解码器或编码器的名字或特殊值 copy(仅对输出有效)说明流不会被重新编码。
例如:
<span style="white-space:pre"> </span>ffmpeg -i INPUT -map 0 -c:v libx264 -c:a copy OUTPUT
使用libx264编码所有的视频流,并复制所有的音频流。
对每个流,最后匹配的c选项起作用,因此
<span style="white-space:pre"> </span>ffmpeg -i INPUT -map 0 -c copy -c:v:1 libx264 -c:a:137 libvorbis OUTPUT
这个命令会复制除被libx264编码的第二个视频流、被libvorbis编码的第138个音频流外所有的流。
-t duration (input/output)
当在input选项前使用-t参数时(在 -i 参数前),限制从输入文件读取数据的持续时间。
当在output选项前使用时(在输出文件名前),当达到了设置的持续时间则停止向输出写。
持续时间必须是根据规范设置的,详见(ffmpeg-utils)duration一章。
-to 和-t 是互斥的,-t具有优先权。
-to position (output)
在position时刻停止向输出文件中写。position必须满足duration的规范。详见(ffmpeg-utils)duration一章。
-to 和-t 是互斥的,-t具有优先权。
-fs limit_size (output)
设置文件大小限制,以字节表示。当超出限制后不会有字节被写入文件。输出文件的大小会比所需文件稍小。
-ss position(input/output)
当用来作为一个输入选项时(在 -i之前),ffmpeg会寻找到 position时间的位置。注意在大多数的编码中ffmpeg不会精确的查找,因此 ffmpeg会查找到最接近position的位置。当转码开启了 -accurate_seek选项时(默认开启),在查找点和最终位置(position)之间的片段会被解码并抛弃。当做流拷贝或使用-noaccurate_seek选项时,在查找点和最终位置(position)之间的片段会被保留。
-sseof position (input/output)
类似使用 -ss参数,但是从文件末尾计算。文件的前面可以使用负值,0代表了文件的结束。
-itsoffset offset(input)
设置输入文件的偏移量
offset 必须是时间类型的参数,详见 ffmpeg-utils 的duration一章。
偏移量是加给输入文件的时间戳。指定一个正的偏移量意味着对应的流是被延迟了offset时间。
-timestamp date (output)
设置容器的时间戳记录。
date 必须是日期标准,详见 ffmpeg-utils的Date一章。
-metadata[:metadata_specifier] key=value (output,per-metadata)
设置元数据 key/value对。
一个可选的metadata_specifier可以设置在流,段或者program(?)的元数据上。
这个选项可以使用-map_metadata来覆盖。也可以使用空值来删除元数据。
例如,设置输出文件的主题
<span style="white-space:pre"> </span>ffmpeg -i in.avi -metadata title=“my title” out.flv
设置第一个音频流的语言
<span style="white-space:pre"> </span>ffmpeg -i INPUT -metadata:s:a:0 language=eng OUTPUT
-program [title=tilte:][program_num=program_num:]st=stream[:st=stream…] (output)
用指定的title,program_num创建一个program,并且把指定的流加到这个program上。
-target type (output)
声明目标文件类型(vcd, dvcd, dvd, dv, dv50)。type可以附加pal-, ntsc-, film- 前缀来使用相应的标准。所有format选项(bitrate, codecs, buffer sizes)会被自动设置。
例如:
<span style="white-space:pre"> </span>ffmpeg -i myfile.avi -target vcd /tmp/vcd.mpg
另外你可以添加其他的选项,只要保证和这个标准不冲突,例如:
<span style="white-space:pre"> </span>ffmpeg -i my file.avi -target vcd -bf 2 /tmp/vcd.mpg
-dframes number (output)
设置写到输出的数据帧数量。此选项有个别名为 -frames:d。
-frames[:stream_specifier] framecount (output, per-stream)
在framecount帧后,停止向流继续写。
-q[:stream_specifier] q (output, per-stream)
-qscale{:stream_specifier] q (output, per-stream)
使用固定的量化标准(可变码率)。这意味着q|qscale是编码器的依赖。如果qscale被使用并且没有声明stream_specifier,qscale仅能被使用在视频流上,这是为了和以前的行为保持兼容 并且声明相同的编码值给音频和视频两个不同的编码器(当没有使用stream_specifier选项时这两个不同的编码器也没有打算使用qscal选项)。
-filter[:stream_specifier] filtergraph (output, per-stream)
根据filtergraph创建过滤图用来过滤流。
filtergraph是应用到流上的过滤图描述,并且相同类型的流只能有一个输入和一个输出。在过滤图中,输入是和 “in”标签相关的, 输出是和“out”标签相关的。详见ffmpeg-filters文档有关于这个预发的详细介绍。
如果你想用多个输入和输出创建过滤图可以看-filter_complex 选项。
-filter_script[:stream_specifier] filename (output, per-stream)
这个选项和-filter选项类似,不同之处是这个选项的参数是从过滤图描述中读取的文件名字。
-pre[:stream_specifier] preset_name (output, per-stream)
指定预设名字的流。
-stats (global)
打印编码的过程/统计。默认开启,可以通过-nostats禁用。
-progress url (global)
把编码过程信息发送到url。
过程信息每隔1秒中写一次,在编码结束后也写一次。过程信息以”key=value”的形式展示。”key”仅仅包含了字母组成的字符。过程信息的最后一位key总是”progress”。
-stdin
可以和标准输入交互。在默认情况下除了非标准输入作为输入。禁止交互可以声明”-nostdin”。
禁止标准输入的交互是有用的,例如,ffmpeg作为后台进程时。也可以粗暴的通过 ffmpeg … < /dev/null来达成这个目的,但还是仍然需要从shell调用。
-debug_ts (global)
打印时间戳信息。默认关闭。这个选项是用来测试和调试的,并且输出格式可以从一个版本变为另外一个版本,因此它不应该在移植的脚本中使用。
也可以看“-fdebug ts” 这个选项。
-attach filename (output)
为输入的文件增加附件。这个选项是被几种格式支持的,例如Matroska等 用来渲染字母的字体。附件被实现为一种特殊形式的流,因此这个选项添加了一个新的流到输出文件。然后可以使用通常的方式对待这个流。附件流是在所有其他流被创建后创建的(其他流通过-map或自动匹配创建)。
注意为Matroska你必须设置mimetype元数据标签:
<span style="white-space:pre"> </span>ffmpeg-i INPUT -attach DejaVuSans.ttf -metadata:s:2 mimetype=application/x-truetype-font out.mkv
(推测附件流是作为输出文件的第三个流)
-dump_attachment[:stream_specifier] filename (input, per-stream)
提取匹配的附件流到名字为 filename的文件。如果文件是空的,filename的元数据标签会被使用作为filename。
例如提取第一个附件流到 out.ttf的文件中:
<span style="white-space:pre"> </span>ffmpeg -dump_attachment:t:0 out.ttf -i INPUT
提取所有的附件到根据filename的标签来确定的文件中:
<span style="white-space:pre"> </span>ffmpeg -dump_attachment:t “” -i INPUT
技术说明-附件是被编码的额外数据实现,因此这个选项可以用来从任何流中抽取额外数据,而不仅仅是附件。
-noautorotate
在视频的元数据中设置禁止转换视频角度。