zoukankan      html  css  js  c++  java
  • ffmpeg

    搞了一段时间流媒体,ubuntu系统下的arm开发板版本和x86有些不一样,逼得小僧把文档翻译了一遭,在此记下相对重要的参数分与后来的你,希望帮到同路过这段幽径的你!如有错误请勘误,如有疑问可交流,等你哦,哈哈~

    NAME
    ffmpeg - ffmpeg video converter
    
    概要
     ffmpeg [global_options] {[input_file_options] -i input_file} ... {[output_file_options] output_file} ...
    
    描述

    ffmpeg是一种非常快速的视频和音频转换器,也可以从实时音频/视频源中获取。 它还可以在任意采样率之间转换,并使用高质量的多相滤波器即时调整视频大小。

    ffmpeg读取由“ -i”选项指定的任意数量的输入“文件”(可以是常规文件,管道,网络流,抓取设备等),并写入任意数量的输出“文件” ,由纯输出文件名指定。 在命令行上找到的所有不能解释为选项的内容都被视为输出文件名。

    每个输入或输出文件原则上可以包含任意数量的不同类型的流(视频/音频/字幕/附件/数据)。 流的允许数量和/或类型可能会受到容器格式的限制。 自动或使用“ -map”选项选择要从哪些输入流进入哪个输出(请参阅“流选择”一章)。

    要在选项中引用输入文件,必须使用其索引(从0开始)。 例如。 第一个输入文件为0,第二个输入文件为1,依此类推。类似地,文件中的流由其索引引用。例如。 “ 2:3”是指第三输入文件中的第四流。 另请参阅“流说明符”一章。

    通常,选项将应用于下一个指定的文件。因此,顺序很重要,您可以在命令行上多次使用相同的选项。 然后,将每次出现都应用于下一个输入或输出文件。此规则的例外是全局选项(例如,详细级别),应首先指定。

    不要混合输入文件和输出文件--first指定所有输入文件,然后指定所有输出文件。也不要混用属于不同文件的选项。所有选项仅适用于下一个输入或输出文件,并且在文件之间重置。

    • 将输出文件的视频比特率设置为64 kbit / s

      ffmpeg -i input.avi -b:v 64k -bufsize 64k output.avi

    • 强制输出文件的帧速率为24 fps

      ffmpeg -i input.avi -r 24 output.avi

    • 将输入文件的帧速率(仅适用于原始格式)强制为1 fps,将输出文件的帧速率强制为24 fps

      ffmpeg -r 1 -i input.m2v -r 24 output.avi

    原始输入文件可能需要format选项。

    详细说明

    ffmpeg中每个输出的转码过程可以通过下图描述:

    ffmpeg调用libavformat库(包含解复用器)以读取输入文件并从中获取包含编码数据的数据包。 当有多个输入文件时,ffmpeg尝试通过跟踪任何活动输入流上的最低时间戳来使它们保持同步。

    然后,已编码的数据包将传递到解码器(除非为流选择了流复制,否则请参见说明)。 解码器产生未压缩的帧(原始视频/ PCM音频/ ...),可以通过过滤进一步处理(请参阅下一节)。 过滤后,将帧传递到编码器,编码器对其进行编码并输出编码后的数据包。 最后,将这些信息传递到复用器,该复用器将编码的数据包写入输出文件。

    Filtering

    在编码之前,ffmpeg可以使用libavfilter库中的过滤器处理原始音频和视频帧。 几个链接的过滤器形成一个过滤器图。 ffmpeg区分两种类型的过滤器图:简单过滤器和复杂过滤器。

    Simple filtergraphs

    简单的过滤器图是那些只有一个输入和输出,并且都是相同类型的过滤器。 在上图中,可以通过在解码和编码之间简单插入一个附加步骤来表示它们

    简单的过滤器图在流前使用 -filter选项配置(分别为视频和音频使用-vf和-af别名)。 一个简单的视频过滤器可以看起来像这样

    请注意,某些过滤器会更改帧属性,但不会更改帧内容。 例如。 上例中的“ fps”过滤器会更改帧数,但不会触及帧内容。 另一个示例是“ setpts”过滤器,该过滤器仅设置时间戳,否则不传递帧。

    复杂的滤镜

    复杂的过滤器图不能简单地描述为应用于一个流的线性处理链。 例如,当图形具有多个输入和/或输出时,或者输出流类型与输入不同时,就是这种情况。 它们可以用下图表示

    复杂的过滤器图是通过-filter_complex选项配置的。 请注意,此选项是全局选项,因为复杂的滤镜本质上不能与单个流或文件明确关联。

    -lavfi选项等效于-filter_complex。

    复杂过滤器图的一个简单例子是“重叠”过滤器,它具有两个视频输入和一个视频输出,其中一个视频叠加在另一个视频之上。 其音频副本是“ amix”过滤器。

    流复制

    流复制是通过向-codec选项提供“ copy”参数来选择的模式。 它使ffmpeg省略了指定流的解码和编码步骤,因此仅进行解复用和复用。 这对于更改容器格式或修改容器级别的元数据很有用。 在这种情况下,上图将简化为:

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

    流选择

    默认情况下,ffmpeg仅在输入文件中包含每种类型(视频,音频,字幕)的一个流,并将它们添加到每个输出文件中。 它根据以下标准选择每个中的“最佳”:对于视频,它是最高分辨率的流,对于音频,它是具有最多频道的流,对于字幕,这是第一个字幕流。 在几个相同类型的流平均分配的情况下,选择索引最低的流。

    您可以使用“ -vn / -an / -sn”选项禁用某些默认值。 对于完全手动控制,请使用“ -map”选项,该选项将禁用刚刚描述的默认值。

    选项

    所有数字选项(如果未另行指定)都接受代表数字的字符串作为输入,可以在其后跟随SI单位前缀之一,例如:“ K”,“ M”或“ G”。
    如果将“ i”附加到SI单位前缀,则完整前缀将被解释为二进制倍数的单位前缀,二进制倍数基于1024的幂而不是1000的幂。在SI单位前缀后附加“ B”将值乘以8。这允许使用“ KB”,“ MiB”,“ G”和“ B”作为数字后缀。
    不带参数的选项是布尔选项,并将相应的值设置为true。 通过在选项名称前加上“ no”,可以将它们设置为false。 例如,使用“ -nofoo”会将名称为“ foo”的布尔选项设置为false。

    流说明符

    每个流会应用某些选项,例如 比特率或编解码器。 流说明符用于精确指定给定选项所属的流。

    流说明符是通常附加到选项名称并由冒号分隔的字符串。 例如。 “ -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”表示视频,“ a”表示音频,“ s”表示字幕,“ d”表示数据,“ t”表示附件。 如果指定了stream_index,则它匹配此类型的流号stream_index。 否则,它将匹配此类型的所有流。
    • p:program_id [:stream_index]
                  如果指定了stream_index,则它将ID为program_id的程序中的流与流号stream_index相匹配。 否则,它将匹配程序中的所有流。
    • stream_id或i:stream_id

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

    • m:key [:value]
                  将流与具有指定值的元数据标签键匹配。 如果未提供value,则将包含给定标签的流与任何值进行匹配。
                  请注意,在ffmpeg中,按元数据进行的匹配仅适用于输入文件。

    通用选项

    这些选项在ff *工具之间共享。
    -version
    Show version.

    -formats
    Show available formats.

    -codecs
    Show all codecs known to libavcodec.
    Note that the term 'codec' is used throughout this documentation as a shortcut for what is more correctly called a media bitstream format.

    -decoders
    Show available decoders.

    -encoders
    Show all available encoders.

    -bsfs
    Show available bitstream filters.

    -protocols
    Show available protocols.

    -filters
    显示可用的libavfilter过滤器。

    -pix_fmts
    Show available pixel formats.

    -sample_fmts
    Show available sample formats.

    -layouts
    显示频道名称和标准频道布局。
    -colors
    Show recognized color names.
    -hide_banner
    禁止打印横幅。
    所有FFmpeg工具通常都会显示版权声明,构建选项和库版本。 此选项可用于禁止打印此信息。
    -opencl_bench
    对所有可用的OpenCL设备进行基准测试并显示结果。 仅当使用“ --enable-opencl”编译FFmpeg时,此选项才可用。
    options必须是key=value选项对列表,并用':'分隔。 有关支持的选项的列表,请参见ffmpeg-utils手册中的``OpenCL选项''部分。

    AV选项

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

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

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

    例如,要将ID3v2.3标头而不是默认ID3v2.4写入MP3文件,请使用MP3多路复用器的id3v2_version私有选项:

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

    所有编解码器AVOptions都是按流的,因此应将流说明符附加到它们。

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

    注意:通过在选项名称前添加v / a / s来指定每流AVOptions的旧的未公开方法现在已经过时,并且将很快删除。

    Main options

    -f fmt (input/output)
    强制输入或输出文件格式。通常会自动检测输入文件的格式,并从文件扩展名中猜测输出文件的格式,因此在大多数情况下不需要此选项。

    -i filename (input)
    input file name

    -y (global)
      覆盖输出文件而无需询问。

    -n (global)
     不要覆盖输出文件,如果指定的输出文件已经存在,请立即退出。

    -c[:stream_specifier] codec (input/output,per-stream)
    -codec[:stream_specifier] codec (input/output,per-stream)
     为一个或多个流选择编码器(在输出文件之前使用)或解码器(在输入文件之前使用)。codec是解码器/编码器的名称,或者是特殊值“ copy”(仅输出),用于指示将不对流进行重新编码。

                   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
    

    将复制除第二个视频(使用libx264编码)和第138个音频(使用libvorbis编码)以外的所有流。
    -t duration (input/output)
    当用作输入选项时(在“ -i”之前),限制从输入文件读取数据的持续时间。
    当用作输出选项时(在输出文件名之前),请在持续时间达到持续时间后停止写入输出。 duration可以是以秒为单位的数字,也可以是“ hh:mm:ss [.xxx]”形式。-to和-t是互斥的,并且-t具有优先级。

    -to position (output)
    在该位置停止写入输出。 position可以是以秒为单位的数字,也可以是“ hh:mm:ss [.xxx]”形式。
               -to和-t是互斥的,并且-t具有优先级。

    -fs limit_size (output)
     设置文件大小限制,以字节为单位。

    -ss position (input/output)
    当用作输入选项时(在“ -i”之前),在此输入文件中查找位置。请注意,大多数格式都无法精确查找,因此ffm​​peg将查找到最接近的查找点
               位置之前。启用转码和-accurate_seek时(默认设置),在搜索点和位置之间的此额外片段将被解码并丢弃。在进行流复制或
               当使用-noaccurate_seek时,它将被保留。
               当用作输出选项时(在输出文件名之前),将解码但放弃输入,直到时间戳到达位置为止。
               位置可以是秒,也可以是“ hh:mm:ss [.xxx]”形式。

    -itsoffset offset (input)
    置输入时间偏移。
    offset必须为持续时间规范,请参见ffmpeg-utils(1)手册中的“持续时间”部分。
    偏移量将添加到输入文件的时间戳中。指定正偏移量意味着相应的流将延迟偏移量中指定的持续时间。

    -timestamp date (output)
    在容器中设置记录时间戳。
                date必须是持续时间规范,请参见ffmpeg-utils(1)手册中的“日期”部分。

    -metadata[:metadata_specifier] key=value (output,per-metadata)
    设置元数据键/值对。
            可以提供可选的metadata_specifier来设置流或章上的元数据。 有关详细信息,请参见“ -map_metadata”文档。
    该选项将覆盖使用“ -map_metadata”设置的元数据。 也可以通过使用空值来删除元数据。

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

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

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

                   ffmpeg -i INPUT -metadata:s:a:0 language=eng OUTPUT
    

    -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的含义取决于编解码器。如果在不使用stream_specifier的情况下使用qscale,则它仅适用于视频流,这是为了保持与以前的行为的兼容性,并且当不使用stream_specifier时,通常不会为2个不同的音频和视频编解码器指定相同的编解码器特定值。

    Video Options

    -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专用选项的快捷方式,已被某些多路分配器识别,其帧大小未存储在文件中或可配置,例如: 原始视频或视频采集卡。
    作为输出选项,这会将比例视频滤镜插入到相应滤镜图的末尾。 请直接使用刻度过滤器将其插入开头或其他位置。
    格式为“ wxh”(默认-与源相同)。

    -aspect[:stream_specifier] aspect (output,per-stream)
    设置纵横比指定的视频显示纵横比。
    Aspect可以是浮点数字符串,也可以是num:den形式的字符串,其中num和den是纵横比的分子和分母。 例如,“ 4:3”,“ 16:9”,“ 1.3333”和“ 1.7777”是有效的参数值。
    如果与-vcodec复制一起使用,它将影响存储在容器级别的纵横比,但不影响存储在编码帧中的纵横比(如果存在)。

    Audio Options

    -aframes number (output)
    设置要输出的音频帧数。 这是-frames:a的过时别名,应改为使用。

    -ar[:stream_specifier] freq (input/output,per-stream)
    设置音频采样频率。 对于输出流,默认情况下将其设置为相应输入流的频率。 对于输入流,此选项仅对音频捕获设备和原始多路分配器有意义,并映射到相应的多路分配器选项。

    -aq q (output)
    设置音频质量(特定于编解码器的VBR)。 这是-q:a的别名。

    -ac[:stream_specifier] channels (input/output,per-stream)
    设置音频通道数。 对于输出流,默认情况下将其设置为输入音频通道的数量。 对于输入流,此选项仅对音频捕获设备和原始多路分配器有意义,并映射到相应的多路分配器选项。

    -an (input/output)
    作为输入选项,阻止文件的所有音频流被过滤或为任何输出自动选择或映射。 请参阅-discard选项以分别禁用流。
    作为输出选项,禁用音频记录,即自动选择或映射任何音频流。 有关完整的手动控制,请参见-map选项。

    -acodec codec (input/output)
    设置音频编解码器。 这是-codec:a的别名。

    Video and Audio grabbing

    如果指定输入格式和设备,则ffmpeg可以直接捕获视频和音频。
    ffmpeg -f oss -i /dev/dsp -f video4linux2 -i /dev/video0 /tmp/out.mpg

    或使用ALSA音频源(单输入,卡ID为1)代替OSS:
    ffmpeg -f alsa -ac 1 -i hw:1 -f video4linux2 -i /dev/video0 /tmp/out.mpg

    请注意,在使用任何电视查看器(例如Gerd Knorr的xawtv)启动ffmpeg之前,您必须激活正确的视频源和频道。 您还必须使用标准混音器正确设置音频录制电平。

  • 相关阅读:
    ADFS登录界面自定义
    C# 不添加WEB引用调用WSDL接口
    C# 对象转XML 支持匿名类
    NSdata 与 NSString,Byte数组,UIImage 的相互转换
    《.NETer提高效率——环境部署》
    (五) Docker 安装 Nginx
    (六) Docker 部署 Redis 高可用集群 (sentinel 哨兵模式)
    (七) Docker 部署 MySql8.0 一主一从 高可用集群
    (八) Docker 部署 mongodb
    (四) Docker 使用Let's Encrypt 部署 HTTPS
  • 原文地址:https://www.cnblogs.com/yuliangkaiyue/p/12686169.html
Copyright © 2011-2022 走看看