• ffmpeg命令行官网摘要


    1.官网命令例子

    ffmpeg -i input.avi -b:v 64k -bufsize 64k output.avi //修改视频码率  视频质量明显下降

    ffmpeg -i input.avi -r 24 output.avi //修改帧率    为啥码率反而增大了???

    2. ffmpeg转码流程

     _______              ______________
    |       |            |              |
    | input |  demuxer   | encoded data |   decoder
    | file  | ---------> | packets      | -----+
    |_______|            |______________|      |
                                               v
                                           _________
                                          |         |
                                          | decoded |
                                          | frames  |
                                          |_________|
     ________             ______________       |
    |        |           |              |      |
    | output | <-------- | encoded data | <----+
    | file   |   muxer   | packets      |   encoder
    |________|           |______________|

    ffmpeg调用libavformat读取输入文件,得到编码的数据。然后传递给解码器,解码得到原始数据video:yuv, audio:pcm,然后传递给过滤器然后传递给编码器,然后传递给复用器muxer
    3.在编码之前,ffmpeg 可以使用 libavfilter 库中的过滤器处理原始音频和视频帧。几个链式过滤器形成一个过滤器图。 ffmpeg 区分两种类型的过滤器图:简单和复杂。
    简单的过滤器:

    _________ ______________
    |         |                      |              |
    | decoded |                      | encoded data |
    | frames  |\                   _ | packets      |
    |_________| \                  /||______________|
                 \   __________   /
      simple     _\||          | /  encoder
      filtergraph   | filtered |/
                    | frames   |
                    |__________|
    使用 per-stream -filter 选项配置简单的过滤器图(分别为视频和音频使用 -vf 和 -af 别名)。一个简单的视频过滤图可以看起来像这样:
     _______        _____________        _______        ________
    |       |      |             |      |       |      |        |
    | input | ---> | deinterlace | ---> | scale | ---> | output |
    |_______|      |_____________|      |_______|      |________|
    请注意,某些过滤器会更改框架属性,但不会更改框架内容。例如。上面示例中的 fps 过滤器会更改帧数,但不会触及帧内容。另一个例子是 setpts 过滤器,它只设置时间戳,否则不改变传递帧
    复杂过滤器:
     _________
    |         |
    | input 0 |\                    __________
    |_________| \                  |          |
                 \   _________    /| output 0 |
                  \ |         |  / |__________|
     _________     \| complex | /
    |         |     |         |/
    | input 1 |---->| filter  |\
    |_________|     |         | \   __________
                   /| graph   |  \ |          |
                  / |         |   \| output 1 |
     _________   /  |_________|    |__________|
    |         | /
    | input 2 |/
    |_________|
    复杂过滤器图使用 -filter_complex 选项进行配置。请注意,此选项是全局的,因为复杂的过滤器图就其性质而言,不能明确地与单个流或文件相关联。
    -lavfi 选项等效于 -filter_complex。
    复杂过滤器图的一个简单示例是叠加过滤器overlay,它有两个视频输入和一个视频输出,其中一个视频叠加在另一个之上。它的音频对应物是 amix 过滤器。
    4.流复制-不能使用过滤器功能
    流复制是通过将copy参数提供给 -codec 选项来选择的模式,它使 ffmpeg 省略了对指定流的解码和编码步骤,因此它只进行解复用和复用。
    它对于更改容器格式或修改容器级元数据很有用。在这种情况下,上图将简化为
    _______ ______________ ________
    |       |            |              |          |        |
    | input |  demuxer   | encoded data |  muxer   | output |
    | file  | ---------> | packets      | -------> | file   |
    |_______|            |______________|          |________|
    

     由于没有解码或编码,所以速度非常快,没有质量损失。但是,由于许多因素,它在某些情况下可能不起作用。应用过滤器显然也是不可能的,因为过滤器适用于未压缩的数据。

    5.流选择
    5.1 自动流选择
    在特定输出文件没有任何映射选项的情况下,ffmpeg 检查输出格式以检查其中可以包含哪种类型的流,即。视频、音频和/或字幕。对于每种可接受的流类型,ffmpeg 将从所有输入中选择一个流(如果可用
    5.2 手动流选择
    使用 -map 时,该输出文件中仅包含用户映射的流,但下面描述的 filtergraph 输出可能有一个例外。
    5.3 复杂的过滤器图

    ffmpeg -decoders //打印所有的解码器

    ffmpeg -encoders //打印所有的编码器
    -formats
    -filters 
    -bsfs
    -protocols 
    -devices
    -demuxers
    -muxers
    -codecs
    -pix_fmts
    -sample_fmts
    -layouts
    -dispositions
    -colors
    -loglevel
    quiet, -8’什么都不显示;安静。
    panic, 0’仅显示可能导致进程崩溃的致命错误,例如断言失败。这目前不用于任何事情。
    fatal, 8’只显示致命错误。这些是错误,之后该过程绝对无法继续
    error, 16’显示所有错误,包括可以从中恢复的错误。
    warning, 24’显示所有警告和错误。将显示与可能不正确或意外事件相关的任何消息。
    info, 32’在处理过程中显示信息性消息。这是对警告和错误的补充。这是默认值。
    verbose, 40’与 info 相同,但更详细
    debug, 48’Show everything, including debugging information.
    trace, 56’例如要启用重复的日志输出,添加级别前缀,并将日志级别设置为详细:
    -report
    -hide_banner所有 FFmpeg 工具通常都会显示版权声明、构建选项和库版本。此选项可用于禁止打印此信息。
    -f 强制输入或输出文件格式。通常会自动检测输入文件的格式,并根据输出文件的文件扩展名猜测格式,因此在大多数情况下不需要此选项。
    -i input file url
    -y(global)   无需询问即可覆盖输出文件
    -n(global)  不要覆盖输出文件,如果指定的输出文件已经存在则立即退出
    -stream_loop number (input)  设置输入流应循环的次数。循环 0 表示无循环,循环 -1 表示无限循环。
    -recast_media (global)  允许强制使用与解复用器检测或指定的媒体类型不同的解码器。对于解码混合为数据流的媒体数据很有用。
    -c[:stream_specifiercodec (input/output,per-stream)
    -codec[:stream_specifiercodec (input/output,per-stream)
    为一个或多个流选择编码器(在输出文件之前使用时)或解码器(在输入文件之前使用时)。 codec 是解码器/编码器的名称或特殊值副本(仅输出),用于指示流不会被重新编码。
    ffmpeg -i INPUT -map 0 -c:v libx264 -c:a copy OUTPUT 使用 libx264 编码所有视频流并复制所有音频流。 对于每个流,应用最后一个匹配的 c 选项,所以
    ffmpeg -i INPUT -map 0 -c copy -c:v:1 libx264 -c:a:137 libvorbis OUTPUT
    -t duration (input/output)当用作输入选项时(在 -i 之前),限制从输入文件读取数据的持续时间。当用作输出选项时(在输出 url 之前),在其持续时间达到持续时间后停止写入输出。
    -to and -t are mutually exclusive and -t has priority.
    -to position (input/output) 停止在位置写入输出或读取输入
    -fs limit_size (output) 设置文件大小限制,以字节表示。超出限制后不再写入更多字节块。输出文件的大小略大于请求的文件大小。
    -ss position (input/output) 当用作输入选项时(在 -i 之前),在此输入文件中查找位置。请注意,在大多数格式中,不可能精确查找,因此 ffmpeg 将查找位置之前最近的查找点。当转码和 -accurate_seek 启用(默认)时,搜索点和位置之间的这个额外段将被解码并丢弃。在进行流复制或使用 -noaccurate_seek 时,它将被保留。 当用作输出选项时(在输出 url 之前),解码但丢弃输入,直到时间戳到达位置
    -sseof position (input)与 -ss 选项类似,但相对于“文件结尾”。也就是说,负值在文件中较早,0 在 EOF 处。
    -itsoffset offset (input)设置输入时间偏移
    -itsscale scale (input,per-stream) 重新调整输入时间戳。 scale 应该是一个浮点数。
    -timestamp date (output) 在容器中设置录制时间戳。
    -metadata[:metadata_specifier] key=value (output,per-metadata) 设置元数据键/值对。
    可以给出一个可选的 metadata_specifier 来设置流、章节或程序的元数据。有关详细信息,请参阅 -map_metadata 文档。
    ffmpeg -i in.avi -metadata title="my title" out.flv-disposition[:stream_specifier] value (output,per-stream) Sets the disposition for a stream.-program [title=title:][program_num=program_num:]st=stream[:st=stream...] (output) 创建具有指定标题 program_num 的程序并将指定的流添加到它
    -target type (output)  指定目标文件类型(vcd、svcd、dvd、dv、dv50)。 type 可以以 pal-、ntsc- 或 film- 为前缀以使用相应的标准。然后自动设置所有格式选项(比特率、编解码器、缓冲区大小)。您只需键入:
    -dn(input/output) 作为输入选项,阻止文件的所有数据流被过滤或被自动选择或映射以用于任何输出。请参阅 -discard 选项以单独禁用流。
    -dframes number (output) 设置要输出的数据帧数。这是 -frames:d 的过时别名,您应该改用它。
    -frames[:stream_specifierframecount (output,per-stream) Stop writing to the stream after framecount frames.
    -q[:stream_specifierq (output,per-stream)-qscale[:stream_specifierq (output,per-stream)使用固定质量等级 (VBR)。 q/qscale 的含义取决于编解码器。如果 qscale 在没有 stream_specifier 的情况下使用,则它仅适用于视频流,这是为了保持与先前行为的兼容性,并且为 2 个不同的编解码器指定相同的编解码器特定值,即音频和视频通常不是没有 stream_specifier 时的预期用来
    -filter[:stream_specifierfiltergraph (output,per-stream) 创建由 filtergraph 指定的 filtergraph 并使用它来过滤流。
    -filter_script[:stream_specifierfilename (output,per-stream) 此选项类似于 -filter,唯一的区别是它的参数是要从中读取 filtergraph 描述的文件的名称
    -reinit_filter[:stream_specifierinteger (input,per-stream)
    -filter_threads nb_threads (global) 定义用于处理过滤器管道的线程数。每个管道都会产生一个线程池,其中有这么多线程可用于并行处理。默认值是可用 CPU 的数量
    -pre[:stream_specifierpreset_name (output,per-stream) 指定匹配流的预设。
    -stats (global) 打印编码进度/统计信息。默认情况下它处于启用状态,要显式禁用它,您需要指定 -nostats。
    -stats_period time (global) 设置更新编码进度/统计信息的周期。默认值为 0.5 秒。
    -progress url (global)
    -stdin 在标准输入上启用交互。默认情况下打开,除非标准输入用作输入。要显式禁用交互,您需要指定 -nostdin
    -debug_ts (global)打印时间戳信息。默认情况下它是关闭的。此选项主要用于测试和调试目的,输出格式可能会从一个版本更改为另一个版本,因此可移植脚本不应使用它。
    -attach filename (output) 将附件添加到输出文件。这得到了一些格式的支持,比如 Matroska,例如用于渲染字幕的字体。附件被实现为特定类型的流,因此此选项将向文件添加新流。然后可以以通常的方式在此流上使用每个流选项。使用此选项创建的附件流将在所有其他流之后创建(即使用 -map 或自动映射创建的那些流)。
    -dump_attachment[:stream_specifierfilename (input,per-stream)将匹配的附件流提取到名为 filename 的文件中。如果文件名为空,则将使用文件名元数据标记的值。
    -vframes number (output) Set the number of video frames to output. This is an obsolete alias for -frames:v, which you should use instead.
    -r[:stream_specifierfps (input/output,per-stream) 设置帧速率
    -fpsmax[:stream_specifierfps (output,per-stream) 设置最大帧速率
    -s[:stream_specifiersize (input/output,per-stream)
    设置帧大小
    -aspect[:stream_specifieraspect (output,per-stream) 设置 aspect 指定的视频显示宽高比。
    -vn (input/output) 作为输入选项,阻止文件的所有视频流被过滤或被自动选择或映射以用于任何输出 作为输出选项,禁用视频录制,即自动选择或映射任何视频流。
    -vcodec codec (output)  设置视频编解码器。这是 -codec:v 的别名。
    -pass[:stream_specifiern (output,per-stream)
    选择通行证编号(1 或 2)。它用于进行两遍视频编码。视频的统计信息在第一次传递中记录到日志文件中(另请参见选项 -passlogfile),在第二次传递中,该日志文件用于以确切请求的比特率生成视频。在第 1 阶段,您可以只停用音频并将输出设置为 null,Windows 和 Unix 的示例:
    -passlogfile[:stream_specifierprefix (output,per-stream) 设置两遍日志文件名前缀为prefix,默认文件名前缀为“ffmpeg2pass”。完整的文件名将是 PREFIX-N.log,其中 N 是特定于输出流的数字
    -vf filtergraph (output) 创建由 filtergraph 指定的 filtergraph 并使用它来过滤流。
    -autorotate 根据文件元数据自动旋转视频。默认启用,使用 -noautorotate 禁用它
    -autoscale 根据第一帧的分辨率自动缩放视频。默认启用,使用 -noautoscale 禁用它。禁用自动缩放时,过滤器图的所有输出帧可能不会具有相同的分辨率,并且对于某些编码器/复用器可能不合适。因此,除非您真的知道自己在做什么,否则不建议禁用它。禁用自动缩放需要您自担风险。
    5.6






    -h, -?, -help, --help 【arg】
    long
    full
    decoder=decoder_name
    encoder=encoder_name
    demuxer=demuxer_name
    muxer=muxer_name
    filter=filter_name
    bsf=bitstream_filter_name
    protocol=protocol_name

    ffmpeg -h encoder=mpeg //打印编码器mpeg4
  • 相关阅读:
    android 之 ListView相关
    android 之 菜单
    android 之 Dialog
    android 之 View
    android 之 service
    android 之 Intent、broadcast
    Service Broadcast简单音乐播放功能
    剑指offer面试题43:n个筛子的点数
    C# LINQ语法
    C# Linq
  • 原文地址:https://www.cnblogs.com/xpylovely/p/16080049.html
Copyright © 2020-2023  润新知