5 选项

所有的数字选项,如果没有另外指定,接受一个字符串 代表一个数字作为输入,其后可以跟随一个SI 单位前缀,例如:'K','M'或'G'。

如果将'i'附加到SI单位前缀,则完整的前缀将会是 解释为基于二进制倍数的单位前缀 1024的幂而不是1000的幂。将"B"附加到SI单元 前缀将该值乘以8.这允许使用,例如: 'KB','MiB','G'和'B'作为数字后缀。

不带参数的选项是布尔选项,并设置 对应的值为true。 可以通过前缀将它们设置为false 选项名称为"否"。 例如使用"-nofoo" 将名称为"foo"的布尔选项设置为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',' 字幕,'d'表示数据,'t'表示附件。 'v'匹配所有视频 流,'V'只匹配没有附加图片,视频的视频流 缩略图或封面艺术。 如果给出了 stream_index ,那么它匹配 此类型的流号 stream_index 。 否则,它匹配所有 这种类型的流。

  • p: program_id[: stream_index] or p: program_id[: stream_type[: stream_index]] or

    p: program_id:M: key[: value] 在第一个版本中,如果给定了 stream_index ,那么它会将流与编号 stream_index 在程序中使用id program_id 。 否则,它会匹配中的所有流 程序。 在第二个版本中, stream_type 是以下之一:'v'表示视频,'a'表示音频,'s' 为字幕,'d'为数据。 如果还给出了 stream_index ,那么它匹配 在具有id program_id 的程序中使用此类型的流编号 stream_index 。 否则,如果仅给出 stream_type ,则它匹配全部 程序中的这种类型的流具有id program_id 。 在第三个版本中,程序中的流与ID为 program_id 的元数据匹配 标签 具有指定的值。 如果 没有给出 value ,匹配包含给定标签的流 值。

  • # stream_id or i: stream_id

    通过流ID匹配流(例如MPEG-TS容器中的PID)。

  • m: key[: value]

    使用具有指定值的元数据标签 key 匹配流。 如果 没有给出 value ,匹配包含给定标签的流 值。

  • u

    使用可用配置匹配流,编解码器必须被定义,并且 必须存在必要的信息,例如视频尺寸或音频采样率。

    请注意,在 ffmpeg 中,通过元数据进行匹配只能正常工作 输入文件。

5.2 通用选项

这些选项由ff *工具共享。

  • -L

    显示许可证。

  • -h, -?, -help, —help [ arg]

    显示帮助。 可以指定一个可选参数来打印关于特定的帮助 项目。 如果没有指定参数,则只有基本(非高级)工具 显示选项。

    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 选项可以获得所有muxers和demuxers的列表。

      • filter= filter_name

        打印有关过滤器名称 filter_name 的详细信息。 使用 -filters 选项可以获取所有过滤器的列表。

    • -version

      显示版本.

    • -formats

      显示可用的格式(包括设备)。

    • -demuxers

      显示可用的分路器

    • -muxers

      显示可用的复用器

    • -devices

      显示可用的设备。

    • -codecs

      显示libavcodec已知的所有编解码器。

      请注意,本文档中使用术语"codec"作为捷径 为什么更正确地称为媒体比特流格式。

    • -decoders

      显示可用的解码器。

    • -encoders

      显示所有可用的编码器。

    • -bsfs

      显示可用的比特流筛选器。

    • -protocols

      显示可用的协议。

    • -filters

      显示可用的libavfilter过滤器。

    • -pix_fmts

      显示可用的像素格式。

    • -sample_fmts

      显示可用的样本格式。

    • -layouts

      显示频道名称和标准频道布局。

    • -colors

      显示公认的颜色名称。

    • -sources device[, opt1= val1[, opt2= val2]…]

      显示输入设备的自动检测源。 某些设备可能会提供无法自动检测的与系统相关的源名称。 返回的列表不能被认为始终完整。

      1. ffmpeg -sources pulse,server=192.168.0.4
    • -sinks device[, opt1= val1[, opt2= val2]…]

      显示输出设备的自动检测接收器。 某些设备可能会提供无法自动检测的系统相关接收器名称。 返回的列表不能被认为始终完整。

      1. ffmpeg -sinks pulse,server=192.168.0.4
    • -loglevel [ flags+] loglevel | -v [ flags+] loglevel

      设置库使用的日志级别和标志。

      可选的 标记前缀可以包含以下值:

        • repeat

          表示重复的日志输出不应压缩到第一行 并且"Last message repeated n times"行将被省略。

        • level

          指示日志输出应为每条消息添加一个 [level] 前缀 线。 这可以用作日志着色的替代,例如, 当倾销的时候 登录到文件。

        通过添加'+'/' - '前缀来设置/重置单个标志,也可以单独使用标志 标志而不影响其他 标志或更改 loglevel 。 什么时候 设置 标志 loglevel ,预计会出现'+'分隔符 在最后一个 标记值和 loglevel 之间。

        loglevel 是包含以下值之一的字符串或数字:

          • quiet, -8

          什么都不显示; 安静。

          • panic, 0

          只显示可能导致进程崩溃的致命错误,例如 断言失败。 这目前不用于任何事情。

          • fatal, 8

          只显示致命错误。 这些过程完全是过程之后的错误 无法继续。

          • error, 16

          显示所有错误,包括可以从中恢复的错误。

          • warning, 24

          显示所有警告和错误。 任何与可能相关的消息 将显示不正确或意外的事件。

          • info, 32

          在处理过程中显示信息性消息。 这是除了 警告和错误。 这是默认值。

          • verbose, 40

          info 相同,除了更详细的内容。

          • debug, 48

          显示一切,包括调试信息。

          • trace, 56

        例如,要启用重复的日志输出,请添加 level 前缀并进行设置 loglevel verbose

        1. ffmpeg -loglevel repeat+level+verbose -i input output

        另一个例子可以在不影响电流的情况下重复输出日志 level 前缀标志或 loglevel 的状态:

        1. ffmpeg [...] -loglevel +repeat

        默认情况下程序会记录到stderr。 如果着色被支持 终端,颜色用于标记错误和警告。 日志着色 可以禁用设置环境变量 AV_LOG_FORCE_NOCOLOR NO_COLOR ,或者可以强制设置 环境变量 AV_LOG_FORCE_COLOR 。 不推荐使用环境变量 NO_COLOR 将会在未来的FFmpeg版本中下降。

        • -report

          将完整的命令行和控制台输出转储到名为的文件中 当前的 程序 - YYYYMMDD - HHMMSS .log 目录。 此文件可用于错误报告。 它也意味着 -loglevel verbose

          将环境变量 FFREPORT 设置为任何值都具有 同样的效果。 如果该值是':' - 分隔的key = value序列,则这些 选项会影响报告; 选项值必须被转义,如果他们 包含特殊字符或选项分隔符':'(请参阅 "引用和转义"部分在ffmpeg-utils手册中)。

        以下选项被认可:

          • file

            设置报告使用的文件名称; %p 扩展为名称 程序中, %t 被扩展为时间戳, %% 被展开 转换为普通的

          • level

            使用数值设置日志详细级别(请参阅 -loglevel )。

          例如,要将报告输出到名为 ffreport.log 的文件 使用 32 (日志级别 info 别名)的日志级别:

          1. FFREPORT=file=ffreport.log:level=32 ffmpeg -i input output

          解析环境变量时的错误不是致命的,也不是 出现在报告中。

          • -hide_banner

            禁止打印标题。

            所有FFmpeg工具通常会显示版权声明,构建选项 和库版本。 该选项可用于抑制打印 此信息。

          • -cpuflags flags ( global)

            允许设置和清除CPU标志。 这个选项是有意的 供测试用。 除非你知道你在做什么,否则不要使用它。

            1. ffmpeg -cpuflags -sse+mmx ...
            2. ffmpeg -cpuflags mmx ...
            3. 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

          5.3 AV选项

          这些选项直接由libavformat,libavdevice和 libavcodec库。 要查看可用AVOptions的列表,请使用 -help 选项。 它们分为两类:

          • generic

            这些选项可以为任何容器,编解码器或设备设置。 通用选项 在容器/设备的AVFormatContext选项下列出 编解码器的AVCodecContext选项。

          • private

            这些选项特定于给定的容器,设备或编解码器。 私人的 选项列在相应的容器/设备/编解码器下。

          例如编写一个ID3v2.3头文件而不是默认的ID3v2.4来 一个MP3文件,使用MP3的 id3v2_version 私人选项 复用器:

          1. ffmpeg -i input.flac -id3v2_version 3 out.mp3

          所有的编解码器AVOptions是每个流,因此是一个流说明符 应该附在他们身上。

          注意: -nooption 语法不能用于布尔值 AVOptions,使用 -option 0 / -option 1

          注意:通过指定每个流AVOptions的旧未公开方式 将v / a / s预先添加到选项名称现在已过时并且将会 即将拆除。

          5.4 主要选项

          • -f fmt ( input/output)

            强制输入或输出文件格式。 格式通常是自动检测输入 文件,并从输出文件的文件扩展名中猜出,所以这个选项不是 在大多数情况下需要。

          • -i url ( input)

            输入文件的地址

          • -y ( global)

            覆盖输出文件而不询问。

          • -n ( global)

            不要覆盖输出文件,并在指定的时候立即退出 输出文件已经存在。

          • -stream_loop number ( input)

            设置输入流应循环的次数。 循环0意味着没有循环, 循环-1意味着无限循环。

          • -c[: stream_specifier] codec ( input/output,per-stream)

          • -codec[: stream_specifier] codec ( input/output,per-stream)

            选择一个编码器(在输出文件之前使用)或解码器(使用时) 在输入文件之前)针对一个或多个流。 codec 是一个名字 解码器/编码器或特殊值 copy (仅输出)来指示 该流不被重新编码。

            例如

            1. ffmpeg -i INPUT -map 0 -c:v libx264 -c:a copy OUTPUT

            使用libx264编码所有视频流并复制所有音频流。

            对于每个流,都会应用最后匹配的 c 选项

            1. ffmpeg -i INPUT -map 0 -c copy -c:v:1 libx264 -c:a:137 libvorbis OUTPUT

            将复制除了第二个视频之外的所有流,这些视频将被编码 libx264和第138个音频,它们将用libvorbis编码。

          • -t duration ( input/output)

            当用作输入选项时(在 -i 之前),限制 持续时间 从输入文件读取数据。

            当用作输出选项时(在输出url之前),停止写入 在持续时间达到 duration 后输出。

            duration 必须是持续时间规范, 请参阅ffmpeg-utils(1)手册中的 (ffmpeg-utils)持续时间部分

            -to和-t是互斥的,-t优先。

          • -to position ( input/output)

            停止写入输出或读取 position 处的输入。 position 必须是持续时间规范, 请参阅ffmpeg-utils(1)手册中的 (ffmpeg-utils)Time duration部分

            -to和-t是互斥的,-t优先。

          • -fs limit_size ( output)

            设置文件大小限制,以字节表示。 没有更多的字节被写入 超过限制后。 输出文件的大小稍微大于 请求的文件大小。

          • -ss position ( input/output)

            当用作输入选项时(在 -i 之前),将在此输入文件中寻找 位置。 请注意,在大多数格式中,不可能精确地查找, 所以 ffmpeg 会在 position 之前寻找最近的搜索点。 当转码和 -accurate_seek 被启用时(默认),这个 搜索点和 位置之间的额外片段将被解码 丢弃。 在进行流式复制或使用 -noaccurate_seek 时, 将被保留。

            当用作输出选项时(在输出url之前),解码但丢弃 输入直到时间戳到达 position

            position 必须是持续时间规范, 请参阅ffmpeg-utils(1)手册中的 (ffmpeg-utils)Time duration部分

          • -sseof position ( input/output)

            -ss 选项一样,但相对于"文件结尾"。 这是消极的 值在文件中较早,0在EOF处。

          • -itsoffset offset ( input)

            设置输入时间偏移。

            offset 必须是一个持续时间规范, 请参阅ffmpeg-utils(1)手册中的 (ffmpeg-utils)Time duration部分

            偏移量被添加到输入文件的时间戳中。指定 正偏移意味着相应的流被延迟了 在 offset 中指定的持续时间。

          • -timestamp date ( output)

            在容器中设置录制时间戳。

            date 必须是日期规范, 请参阅ffmpeg-utils(1)手册中的 (ffmpeg-utils)日期部分

          • -metadata[:metadata_specifier] key= value ( output,per-metadata)

            设置元数据键/值对。

            可以给出一个可选的 metadata_specifier 来设置元数据 在流,章节或程序上。 请参阅 -map_metadata 文档的详细信息。

            此选项覆盖使用 -map_metadata 设置的元数据。 它是 也可以通过使用空值来删除元数据。

            例如,在输出文件中设置标题:

            1. ffmpeg -i in.avi -metadata title="my title" out.flv

            要设置第一个音频流的语言:

            1. ffmpeg -i INPUT -metadata:s:a:0 language=eng OUTPUT
          • -disposition[:stream_specifier] value ( output,per-stream)

            设置流的配置。

            此选项覆盖从输入流复制的配置。 也是 可以通过将其设置为0来删除处置。

            以下处置得到承认:

            • default
            • dub
            • original
            • comment
            • lyrics
            • karaoke
            • forced
            • hearing_impaired
            • visual_impaired
            • clean_effects
            • captions
            • descriptions
            • metadata

            例如,要将第二个音频流设置为默认流:

            1. ffmpeg -i in.mkv -disposition:a:1 default out.mkv

            使第二个字幕流成为默认流并删除默认值 从第一个字幕流处置:

            1. ffmpeg -i INPUT -disposition:s:0 0 -disposition:s:1 default OUTPUT
          • -program [title= title:][program_num= program_num:]st= stream[:st= stream…] ( output)

            用指定的 标题 program_num 创建一个程序并添加指定的 stream (s)。

          • -target type ( output)

            指定目标文件类型( vcd svcd dvd dv ), <代码> DV50)。 type 可以前缀为 pal - ntsc - film - 使用相应的标准。 所有格式选项 (比特率,编解码器,缓冲区大小)会自动设置。 你可以输入:

            1. ffmpeg -i myfile.avi -target vcd /tmp/vcd.mpg

          尽管如此,只要您知道,您可以指定其他选项 他们不与标准冲突,如:

          1. ffmpeg -i myfile.avi -target vcd -bf 2 /tmp/vcd.mpg
          • -dn ( output)

            禁用数据记录。 有关完整的手动控制,请参阅 -map 选项。

          • -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)

            使用固定质量等级(VBR)。 q / qscale 的含义是 编解码器依赖。 如果 qscale 没有使用 stream_specifier ,那么它仅适用于 到视频流,这是为了保持与以前的行为的兼容性 并为2个不同的编解码器指定相同的编解码器特定值 音频和视频通常不是当没有stream_specifier时的意图 用过的。

          • -filter[: stream_specifier] filtergraph ( output,per-stream)

            创建由 filtergraph 指定的filtergraph并将其用于 过滤流。

            filtergraph 是要应用于的filtergraph的描述 流,并且必须具有单个输入和单个输出 相同类型的流。 在filtergraph中,输入是关联的 到中的标签,并将输出发送到标签 out 。 看到 有关filtergraph的更多信息,请参阅ffmpeg-filters手册 句法。

            如果你想看 -filter_complex选项 想要创建具有多个输入和/或输出的过滤器图。

          • -filter_script[: stream_specifier] filename ( output,per-stream)

            这个选项类似于 -filter ,唯一的区别是它的 参数是过滤器图形描述文件的名称 读。

          • -filter_threads nb_threads ( global)

            定义用于处理过滤器管道的线程数。 每个管道 将产生一个线程池,其中有许多线程可用于并行处理。 缺省值是可用CPU的数量。

          • -pre[: stream_specifier] preset_name ( output,per-stream)

            为匹配的流指定预设。

          • -stats ( global)

            打印编码进度/统计。 默认情况下,它是明确的 禁用它,你需要指定 -nostats

          • -progress url ( global)

            将程序友好的进度信息发送到 url

            进度信息大概每秒写一次,并在结尾 编码过程。 它由" key = value "行构成。 只包含字母数字字符。 序列的最后一个键 进度信息总是"进步"。

          • -stdin

            在标准输入上启用交互。 默认情况下,除非标准输入是 用作输入。 要明确禁用交互,您需要指定 -nostdin

            例如,如果禁用标准输入交互很有用 ffmpeg位于后台进程组中。 大致相同的结果可以 用 ffmpeg … < /dev/null 来实现,但它需要一个壳。

          • -debug_ts ( global)

            打印时间戳信息。 它默认关闭。 这个选项是 主要用于测试和调试目的以及输出 格式可能会从一个版本更改为另一个版本,所以它不应该是 由便携式脚本使用。

            另见选项 -fdebug ts

          • -attach filename ( output)

            将附件添加到输出文件。 这由几种格式支持 像Matroska对于例如 字幕中使用的字体。附件 被实现为特定类型的流,所以这个选项将被添加 一个新的文件流。 然后可以使用每个流选项 在通常的方式在这个流。 使用此创建的附件流 选项将在所有其他流(即创建的)之后创建 使用 -map 或自动映射)。

            请注意,对于Matroska,您还必须设置mimetype元数据标记:

            1. 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"的文件中:

            1. ffmpeg -dump_attachment:t:0 out.ttf -i INPUT

            将所有附件提取到由 filename 标记确定的文件中:

            1. ffmpeg -dump_attachment:t "" -i INPUT

            技术说明 - 附件实现为编解码器extradata,所以这个 选项实际上可以用来从任何流中提取额外数据,而不仅仅是 附件。

          • -noautorotate

            根据文件元数据禁用自动旋转视频。

          5.5 视频选项

          • -vframes number ( output)

            设置要输出的视频帧数。这是 -frames:v 的一个过时的别名,您应该使用它。

          • -r[: stream_specifier] fps ( input/output,per-stream)

            设置帧率(Hz值,分数或缩写)。

            作为输入选项,忽略存储在文件中的任何时间戳,而是生成时间戳,假设帧速率为 fps 。这与用于某些输入格式(如image2或v4l2)的 -framerate 选项不同(它在FFmpeg的旧版本中与之相同)。如果有疑问,请使用 -framerate 而不是输入选项 -r

            作为输出选项,复制或删除输入帧以实现恒定输出帧频 fps

          • -s[: stream_specifier] size ( input/output,per-stream)

            设置框架大小。

            作为输入选项,这是 video_size 专用选项的快捷方式,由某些分帧器识别,其帧大小未存储在文件中或可配置。 原始视频或视频采集卡。

            作为输出选项,它会将 scale 视频过滤器插入到相应过滤器图的 end 中。 请直接使用 缩放过滤器将其插入开头或其他位置。

            格式为' wxh '(默认 - 与源相同)。

          • -aspect[: stream_specifier] aspect ( output,per-stream)

            设置由 aspect 指定的视频显示宽高比。

            aspect 可以是浮点数字符串,也可以是 num den 格式的字符串,其中 num den 是宽高比的分子和分母。 例如"4:3","16:9","1.3333"和"1.7777"是有效的参数值。

            如果与 -vcodec copy 一起使用,它将影响存储在容器级别的宽高比,但不会影响存储在编码帧中的宽高比(如果存在)。

          • -vn ( output)

            禁用视频录制。 有关完整的手动控制,请参阅 -map 选项。

          • -vcodec codec ( output)

            设置视频编解码器。 这是 -codec:v 的别名。

          • -pass[: stream_specifier] n ( output,per-stream)

            选择通行证号码(1或2)。 它被用来做两路视频编码。 视频的统计信息在第一遍记录到日志文件中(另请参阅-passlogfile选项),并在第二遍中使用日志文件以确切的请求比特率生成视频。 在通过1时,您可以停用音频并将输出设置为空,例如Windows和Unix:

            1. ffmpeg -i foo.mov -c:v libxvid -pass 1 -an -f rawvideo -y NUL
            2. ffmpeg -i foo.mov -c:v libxvid -pass 1 -an -f rawvideo -y /dev/null
          • -passlogfile[: stream_specifier] prefix ( output,per-stream)

            将两遍日志文件名前缀设置为 prefix ,默认文件名前缀为"ffmpeg2pass"。 完整的文件名将是 PREFIX-N.log ,其中N是特定于输出流的数字

          • -vf filtergraph ( output)

            创建由 filtergraph 指定的filtergraph并使用它过滤流。

            这是 -filter:v 的别名,请参阅 -filter选项

          • -atag fourcc/tag ( output)

            强制音频标签/ fourcc。这是 -tag:a 的别名。

          • -absf bitstream_filter

            已弃用,请参阅-bsf

          • -guess_layout_max channels ( input,per-stream)

            如果某些输入通道布局未知,请尝试仅在最多对应于指定数量的通道时进行猜测。 例如,2告诉 ffmpeg 识别1个声道为单声道,2个声道为立体声,而不是6个声道为5.1。 默认是总是尝试猜测。 使用0来禁用所有猜测。

          5.9 字幕选项

          • -scodec codec ( input/output)

            设置字幕编解码器。这是 -codec:s 的别名。

          • -sn ( output)

            禁用字幕录制。有关完整的手动控制,请参阅 -map 选项。

          • -sbsf bitstream_filter

            已弃用,请参阅-bsf

          5.10 高级字幕选项

          • -fix_sub_duration

            修复字幕的持续时间。 对于每个字幕,请等待同一个流中的下一个数据包,并调整第一个数据包的长度以避免重叠。 这对于一些字幕编解码器,尤其是DVB字幕是必要的,因为原始分组中的持续时间仅仅是粗略的估计,并且结尾实际上由空白的字幕框标记。 在必要时未能使用此选项可能会导致夸张的持续时间或由于非单调时间戳而导致的混合失败。

            请注意,此选项会延迟所有数据的输出,直到下一个字幕包被解码为止:这可能会增加内存消耗和延迟。

          • -canvas_size size

            设置用于渲染字幕的画布大小。

          5.11 高级选项

          • -map [-] input_file_id[: stream_specifier][?][, sync_file_id[: stream_specifier]] | [linklabel] ( output)

            指定一个或多个输入流作为输出文件的来源。 每个输入流由输入文件索引 input_file_id 和输入流文件中的输入流索引 input_stream_id 标识。 两个索引都从0开始。如果指定,则指定将哪个输入流用作演示同步参考。 sync_file_id stream_specifier

            命令行上的第一个 -map 选项指定输出流0的源,第二个 -map 选项指定输出流1的源等。

            流标识符之前的 - 字符创建"否定"映射。 它禁用已经创建的映射中的匹配流。

            流索引之后的尾部 将允许地图为可选:如果地图不匹配任何流,则地图将被忽略而不是失败。 请注意,如果使用无效的输入文件索引,地图仍然会失败; 例如,如果地图引用了不存在的输入。

            另一个 [linklabel] 表单将把来自复杂过滤器图形的输出(参见 -filter_complex 选项)映射到输出文件。 linklabel 必须对应于图中定义的输出链接标签。

            例如,将来自第一个输入文件的所有流映射到输出

            1. ffmpeg -i INPUT -map 0 output

          例如,如果您在第一个输入文件中有两个音频流,则这些流由"0:0"和"0:1"标识。 您可以使用 -map 来选择要放置在输出文件中的流。 例如:

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

          将输入流映射到由 <0:1>标识的 INPUT out.wav 中的(单个)输出流。

          例如,要从输入文件 a.mov (由标识符"0:2"指定)中选择索引为2的流,并从输入 b.mov < samp>(由标识符"1:6"指定),并将它们复制到输出文件 out.mov 中:

          1. ffmpeg -i a.mov -i b.mov -c copy -map 0:2 -map 1:6 out.mov

          从输入文件中选择所有视频和第三个音频流:

          1. ffmpeg -i INPUT -map 0:v -map 0:a:2 OUTPUT

          要映射除第二个音频以外的所有流,请使用负映射

          1. ffmpeg -i INPUT -map 0 -map -0:a:1 OUTPUT

          要从第一个输入映射视频和音频流,并使用结尾的 ,如果第一个输入中不存在音频流,请忽略音频映射:

          1. ffmpeg -i INPUT -map 0:v -map 0:a? OUTPUT

          要选择英文音频流:

          1. ffmpeg -i INPUT -map 0:m:language:eng OUTPUT

          请注意,使用此选项会禁用此输出文件的默认映射。

          • -ignore_unknown

            如果试图复制这样的流,忽略具有未知类型的输入流而不是失败。

          • -copy_unknown

            如果试图复制这样的流,允许复制具有未知类型的输入流而不是失败。

          • -map_channel [ input_file_id. stream_specifier. channel_id|-1][?][: output_file_id. stream_specifier]

            将给定输入的音频通道映射到输出。 如果未设置 output_file_id stream_specifier ,则音频通道将映射到所有音频流。

            使用"-1"而不是 input_file_id stream_specifier channel_id 将映射静音通道。

            尾部的 将允许map_channel是可选的:如果map_channel不匹配频道,map_channel将被忽略而不是失败。

            例如,假设 INPUT 是立体声音频文件,您可以使用以下命令切换两个音频声道:

            1. ffmpeg -i INPUT -map_channel 0.0.1 -map_channel 0.0.0 OUTPUT

          如果您想要静音第一个频道并保留第二个频道:

          1. ffmpeg -i INPUT -map_channel -1 -map_channel 0.0.1 OUTPUT

          "-map_channel"选项的顺序指定输出流中通道的顺序。 输出通道布局是从映射的通道数量中猜出的(如果是一个"-map_channel",则为单声道,如果是两个,则为立体声等)。 如果输入和输出通道布局不匹配(例如两个"-map_channel"选项和"-ac 6"),使用"-ac"结合"-map_channel"会使通道增益级别更新。

          您还可以将输入的每个通道提取到特定输出; 以下命令将 INPUT 音频流(文件0,流0)的两个通道提取到相应的 OUTPUT_CH0 OUTPUT_CH1 输出:

          1. ffmpeg -i INPUT -map_channel 0.0.0 OUTPUT_CH0 -map_channel 0.0.1 OUTPUT_CH1

          以下示例将立体声输入的声道分成两个单独的流,它们放在同一个输出文件中:

          1. ffmpeg -i stereo.wav -map 0:0 -map 0:0 -map_channel 0.0.0:0.0 -map_channel 0.0.1:0.1 -y out.ogg

          请注意,目前每个输出流只能包含来自单个输入流的通道; 例如,您不能使用"-map_channel"来选择包含在不同流(来自相同或不同文件)中的多个输入音频通道,并将它们合并到单个输出流中。 因此,例如,现在不可能将两个单独的单声道流变成单个立体声流。 然而,将立体声流分成两个单声道单声道流是可能的。

          如果您需要此功能,可能的解决方法是使用 amerge 过滤器。 例如,如果您需要将具有2个单声道音频流的媒体(此处 input.mkv )合并为一个立体声声道音频流(并保留视频流),则可以使用以下命令:

          1. ffmpeg -i input.mkv -filter_complex "[0:1] [0:2] amerge" -c:a pcm_s16le -c:v copy output.mkv

          要从第一个输入映射前两个音频通道,并使用尾部的 ,如果第一个输入是单声道而不是立体声,则忽略音频通道映射:

          1. ffmpeg -i INPUT -map_channel 0.0.0 -map_channel 0.0.1? OUTPUT
          • -map_metadata[: metadata_spec_out] infile[: metadata_spec_in] ( output,per-metadata)

            infile 设置下一个输出文件的元数据信息。 请注意,这些是文件索引(从零开始),而不是文件名。 可选的 metadata_spec_in / out 参数指定要复制的元数据。 元数据说明符可以具有以下形式:

            • g

              全局元数据,即适用于整个文件的元数据

            • s[: stream_spec]

              每个流元数据。 stream_spec 是一个流说明符,如 流说明符一章中所述。 在输入元数据说明符中,第一个匹配流将从中复制。 在输出元数据说明符中,所有匹配的流都被复制到。

            • c: chapter_index

              每章元数据。 chapter_index 是从零开始的章节索引。

            • p: program_index

              每个节目的元数据。 program_index 是从零开始的程序索引。

              如果省略了元数据说明符,则默认为全局。

              默认情况下,从第一个输入文件复制全局元数据,每个流和每个章节元数据与流/章一起复制。 这些默认映射通过创建相关类型的映射来禁用。 否定文件索引可用于创建仅禁用自动复制的虚拟映射。

              例如,要将输入文件的第一个流中的元数据复制到输出文件的全局元数据:

              1. ffmpeg -i in.ogg -map_metadata 0:s:0 out.mp3
          1. 相反,即将全局元数据复制到所有音频流:
          1. ffmpeg -i in.mkv -map_metadata:s:a 0:g out.mkv
          1. 注意简单的 <code> 0 </code>在这个例子中也可以工作,因为全局元数据是默认的。
          • -map_chapters input_file_index ( output)

            将索引 input_file_index 的输入文件中的章节复制到下一个输出文件。 如果未指定章节映射,则从第一个输入文件中至少复制一章。 使用否定文件索引禁用任何章节复制。

          • -benchmark ( global)

            在编码结尾处显示基准测试信息。 显示使用的实际,系统和用户时间以及最大内存消耗。 所有系统都不支持最大内存消耗,如果不支持,通常显示为0。

          • -benchmark_all ( global)

            在编码过程中显示基准信息。 显示在各个步骤(音频/视频编码/解码)中使用的实际,系统和用户时间。

          • -timelimit duration ( global)

            在ffmpeg运行 duration 秒后退出。

          • -dump ( global)

            将每个输入数据包转储到stderr。

          • -hex ( global)

            当转储数据包时,也转储有效载荷。

          • -re ( input)

            以本机帧速率读取输入。 主要用于模拟抓取设备或实时输入流(例如,从文件读取时)。 不应该与实际的抓取设备或实时输入流一起使用(它可能导致数据包丢失)。 默认情况下, ffmpeg 会尝试尽可能快地读取输入。 该选项将会将输入的读数减慢到输入的本地帧速率。 它对实时输出(例如直播)非常有用。

          • -loop_output number_of_times

            对于支持循环的格式(如动画GIF)(0会无限循环输出),会重复循环输出。 此选项已弃用,请使用-loop。

          • -vsync parameter

            视频同步方法。 由于兼容性原因,旧值可以指定为数字。 新添加的值必须始终指定为字符串。

            • 0, passthrough

              每帧都将其时间戳从分路器传递到复用器。

            • 1, cfr

              帧将被复制并丢弃以达到所要求的恒定帧速率。

            • 2, vfr

              帧通过它们的时间戳或丢弃,以防止2帧具有相同的时间戳。

            • drop

              作为传递但破坏所有时间戳,使得复用器基于帧速率生成新的时间戳。

            • -1, auto

              取决于复用器功能,可在1和2之间选择。这是默认方法。

              请注意,在此之后,时间戳可能会被复用器进一步修改。 例如,在格式选项 avoid_negative_ts 被启用的情况下。

              使用-map,您可以选择从哪个流中获取时间戳。 您可以保持视频或音频不变,并将其余流同步到未更改的视频或音频。

          • -frame_drop_threshold parameter

            帧丢弃阈值,指定在视频帧丢失之前它们可以落后多少。 在帧率单位中,所以1.0是一帧。 默认值是-1.1。 一个可能的用例是在嘈杂的时间戳的情况下避免framedrops,或者在精确时间戳的情况下增加帧丢弃精度。

          • -async samples_per_second

            音频同步方法。 "拉伸/挤压"音频流以匹配时间戳,参数是音频改变的每秒最大采样数。 -async 1是一种特殊情况,其中只有音频流的开始被校正而没有任何稍后的校正。

            请注意,在此之后,时间戳可能会被复用器进一步修改。 例如,在格式选项 avoid_negative_ts 被启用的情况下。

            此选项已被弃用。 改为使用 aresample 音频过滤器。

          • -copyts

            不要处理输入时间戳,而是保持它们的值而不尝试对它们进行消毒。 特别是,不要删除初始开始时间偏移值。

            请注意,根据 vsync 选项或特定的复用器处理(例如,如果启用格式选项 avoid_negative_ts ),输出时间戳可能会与输入时间戳不匹配,即使此操作 选项被选中。

          • -start_at_zero

            copyts 一起使用时,请移动输入时间戳,以便它们从零开始。

            这意味着使用例如 无论输入文件的起始时间是什么, -ss 50 都会使输出时间戳从50秒开始。

          • -copytb mode

            指定如何设置流拷贝时的编码器时基。 mode 是一个整数值,可以假定以下值之一:

            • 1

              使用分路器时基。

              时基从相应的输入分路器复制到输出编码器。 有时需要这样做以避免在复制具有可变帧频的视频流时非单调增加时间戳。

            • 0

              使用解码器时基。

              时基从相应的输入解码器复制到输出编码器。

            • -1

              尝试自动做出选择,以便生成一个理智的输出。

              Default value is -1.

          • -enc_time_base[: stream_specifier] timebase ( output,per-stream)

            设置编码器时基。 timebase 是一个浮点数,并且可以采用以下值之一:

            • 0

              根据媒体类型分配默认值。

              对于视频 - 使用1 /帧率,对于音频 - 使用1 /采样率。

            • -1

              尽可能使用输入流时基。

              如果输入流不可用,则将使用默认时基。

            • >0

              使用提供的数字作为时基。

              该字段可以作为两个整数(例如1:24,1:48000)的比率或作为浮点数(例如0.04166,2.0833e-5)提供,

              默认值是0。

          • -bitexact ( input/output)

            为(反)复用器和(de / en)编码器启用bitexact模式

          • -shortest ( output)

            最短输入流结束时完成编码。

          • -dts_delta_threshold

            时间戳不连续增量阈值。

          • -muxdelay seconds ( input)

            设置最大多路解码延迟。

          • -muxpreload seconds ( input)

            设置初始解复用延迟。

          • -streamid output-stream-index: new-value ( output)

            为输出流分配一个新的stream-id值。 这个选项应该在它应用的输出文件名之前被指定。 对于存在多个输出文件的情况,可将streamid重新分配给不同的值。

            例如,要将输出mpegts文件的流0 PID设置为33并将流1 PID设置为36,请执行以下操作:

            1. ffmpeg -i inurl -streamid 0:33 -streamid 1:36 out.ts
          • -bsf[: stream_specifier] bitstream_filters ( output,per-stream)

            为匹配流设置比特流筛选器。 bitstream_filters 是一个逗号分隔的比特流筛选器列表。 使用 -bsfs 选项来获取比特流筛选器的列表。

            1. ffmpeg -i h264.mp4 -c:v copy -bsf:v h264_mp4toannexb -an out.h264
            1. ffmpeg -i file.mov -an -vn -bsf:s mov2textsub -c:s copy -f rawvideo sub.txt
          • -tag[: stream_specifier] codec_tag ( input/output,per-stream)

            强制标记/ fourcc匹配流。

          • -timecode hh: mm: ssSEP ff

            指定时间码进行写入。 对于非丢弃时间码, SEP 为':',drop为';'(或'。')。

            1. ffmpeg -i input.mpg -timecode 01:02:03.04 -r 30000/1001 -s ntsc output.mpg
          • -filter_complex filtergraph ( global)

            定义一个复杂的滤波器图,即具有任意数量的输入和/或输出的滤波器图。 对于简单的图形 - 那些具有一个输入和一个相同类型输出的图形 - 请参阅 -filter 选项。 filtergraph 是filtergraph的描述,如ffmpeg-filters手册的"Filtergraph语法"一节中所述。

            输入链接标签必须使用 [file_index:stream_specifier] 语法(即与 -map 使用的相同)引用输入流。 如果 stream_specifier 匹配多个流,则将使用第一个流。 未标记的输入将连接到匹配类型的第一个未使用的输入流。

            输出链接标签用 -map 引用。 未标记的输出被添加到第一个输出文件。

            请注意,使用此选项,可以仅使用lavfi来源而不使用正常输入文件。 例如,要通过视频叠加图片(添加水印)

            1. ffmpeg -i video.mkv -i image.png -filter_complex '[0:v][1:v]overlay[out]' -map
            2. '[out]' out.mkv

          这里 [0:v] 是指第一个输入文件中的第一个视频流,它链接到覆盖过滤器的第一个(主)输入。 类似地,第二输入中的第一视频流链接到叠加的第二(叠加)输入。

          假设每个输入文件只有一个视频流,我们可以省略输入标签,所以上面的内容相当于

          1. ffmpeg -i video.mkv -i image.png -filter_complex 'overlay[out]' -map
          2. '[out]' out.mkv

          此外,我们可以省略输出标签,并且过滤器图形的单个输出将自动添加到输出文件,因此我们可以简单地写入

          1. ffmpeg -i video.mkv -i image.png -filter_complex 'overlay' out.mkv

          使用lavfi color 来生成5秒的纯红色视频源:

          1. ffmpeg -filter_complex 'color=c=red' -t 5 out.mkv
          • -filter_complex_threads nb_threads ( global)

            定义用于处理filter_complex图形的线程数。 与filter_threads类似,但仅用于 -filter_complex 图。 缺省值是可用CPU的数量。

          • -lavfi filtergraph ( global)

            定义一个复杂的滤波器图,即具有任意数量的输入和/或输出的滤波器图。 相当于 -filter_complex

          • -filter_complex_script filename ( global)

            该选项类似于 -filter_complex ,唯一的区别是它的参数是要从中读取复杂的filtergraph描述的文件的名称。

          • -accurate_seek ( input)

            该选项使用 -ss 选项启用或禁用在输入文件中精确搜索。 它是默认启用的,所以在转码时寻找是准确的。 使用 -noaccurate_seek 将其禁用,这可能很有用,例如 当复制一些流并转码其他流时。

          • -seek_timestamp ( input)

            此选项启用或禁用通过 -ss 选项通过输入文件中的时间戳搜索。 它默认是禁用的。 如果启用, -ss 选项的参数被视为实际时间戳,并且不会被文件的开始时间所偏移。 这仅适用于不从时间戳0开始的文件,例如传输流。

          • -thread_queue_size size ( input)

            此选项设置从文件或设备读取时排队数据包的最大数量。 对于低延迟/高速直播流,如果没有及时读取数据包,数据包可能会被丢弃; 提高这个值可以避免它。

          • -sdp_file file ( global)

            将输出流的sdp信息打印到 文件。 这允许在至少一个输出不是rtp流时转储sdp信息。 (要求至少有一种输出格式为rtp)。

          • -discard ( input)

            允许在分路器中丢弃特定的流或帧流。 并非所有的demuxers都支持这一点。

            • none

              丢弃没有框架。

            • default

              默认值,不丢弃任何帧。

            • noref

              丢弃所有非参考帧。

            • bidir

              丢弃所有的双向帧。

            • nokey

              丢弃除关键帧之外的所有帧。

            • all

              丢弃所有帧。

          • -abort_on flags ( global)

            停止并在各种条件下中止。以下标志可用:

            • empty_output

              没有数据包被传递到复用器,输出是空的。

          • -xerror ( global)

            出错时停止并退出

          • -max_muxing_queue_size packets ( output,per-stream)

            当转码音频和/或视频流时,ffmpeg将不会开始写入输出,直到每个这样的流有一个数据包。 在等待这种情况发生时,其他数据流的数据包将被缓冲。 此选项为匹配的输出流设置此缓冲区的大小(以数据包为单位)。

            此选项的默认值应该足够大,以便在大多数情况下使用,因此只有在确定需要时才可以触摸此选项。

          作为特殊例外,您可以使用位图字幕流作为输入:它将被转换为与文件中最大视频大小相同的视频,如果不存在视频,则会将其转换为720x576。 请注意,这是一个实验和临时解决方案。 一旦libavfilter对字幕有适当的支持,它将被删除。

          例如,要在以MPEG-TS格式存储的DVB-T录像上对字幕进行硬编码,将字幕延迟1秒钟:

          1. ffmpeg -i input.ts -filter_complex \
          2. '[#0x2ef] setpts=PTS+1/TB [sub] ; [#0x2d0] [sub] overlay' \
          3. -sn -map '#0x2dc' output.mkv

          (0x2d0,0x2dc和0x2ef分别是视频,音频和字幕流的MPEG-TS PID; 0:0,0:3和0:7也可以工作)

          5.12 预设文件

          预设文件包含一系列 选项 = 对,每行一个,指定一系列选项,这些选项在命令行中很难指定。 以散列('#')开头的行将被忽略并用于提供注释。 查看FFmpeg源代码树中的 presets 目录作为例子。

          有两种类型的预设文件:ffpreset和avpreset文件。

          5.12.1 ff预设文件

          使用 vpre apre spre fpre 选项指定ffpreset文件。 fpre 选项将预设的文件名替换为预设名称作为输入,并可用于任何类型的编解码器。 对于 vpre apre spre 选项,预设文件中指定的选项将应用于当前选定的编解码器, 预设选项。

          传递给 vpre apre spre 预设选项的参数根据以下规则标识要使用的预设文件:

          首先,ffmpeg在目录 $ FFMPEG_DATADIR (如果设置)和 $ HOME / .ffmpeg 中搜索名为 arg .ffpreset的文件,并在 按照该顺序,在配置时间(通常为 PREFIX / share / ffmpeg )或在win32上的可执行文件的 ffpresets 文件夹中定义数据目标。 例如,如果参数是 libvpx-1080p ,它将搜索文件 libvpx-1080p.ffpreset

          如果找不到这样的文件,那么ffmpeg将在上述目录中搜索名为 codec_name - arg .ffpreset的文件,其中 codec_name 是将应用预设文件选项的编解码器的名称。 例如,如果您使用 -vcodec libvpx 选择视频编解码器并使用 -vpre 1080p ,那么它将搜索文件 libvpx-1080p.ffpreset SAMP>。

          5.12.2 av预设文件

          avpreset文件是通过 pre 选项指定的。 它们与ffpreset文件类似,但它们只允许编码器特定的选项。 因此,无法使用指定编码器的 选项 = 对。

          当指定 pre 选项时,ffmpeg将查找目录 $ AVCONV_DATADIR (如果设置)和 $ HOME / .avconv中带有后缀.avpreset的文件 和配置时定义的数据目录(通常是 PREFIX / share / ffmpeg )。

          首先,ffmpeg在上述目录中搜索名为 codec_name - arg .avpreset的文件,其中 codec_name 是其编解码器的名称 预设文件选项将被应用。 例如,如果您使用 -vcodec libvpx 选择视频编解码器并使用 -pre 1080p ,那么它将搜索文件 libvpx-1080p.avpreset SAMP>。

          如果找不到这样的文件,那么ffmpeg将搜索一个名为的文件 arg.avpreset in the same directories.