ffmpeg入门教程之ffmpeg命令行瓜皮书------全局命令(翻译)

守給你的承諾、 提交于 2019-11-25 18:46:42

文章目录

ffmpeg入门教程https://www.jianshu.com/p/042c7847bd8a

本文将会持续更新,敬请关注

视频播放器原理

———————————————— 版权声明

此处摘抄部分为CSDN博主「雷霄骅」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/leixiaohua1020/article/details/18893769

视音频技术主要包含以下几点:封装技术,视频压缩编码技术以及音频压缩编码技术。如果考虑到网络传输的话,还包括流媒体协议技术。

视频播放器播放一个互联网上的视频文件,需要经过以下几个步骤:解协议,解封装,解码视音频,视音频同步。如果播放本地文件则不需要解协议,为以下几个步骤:解封装,解码视音频,视音频同步。他们的过程如图所示。

解协议的作用

就是将流媒体协议的数据,解析为标准的相应的封装格式数据。视音频在网络上传播的时候,常常采用各种流媒体协议,例如HTTP,RTMP,或是MMS等等。这些协议在传输视音频数据的同时,也会传输一些信令数据。这些信令数据包括对播放的控制(播放,暂停,停止),或者对网络状态的描述等。解协议的过程中会去除掉信令数据而只保留视音频数据。例如,采用RTMP协议传输的数据,经过解协议操作后,输出FLV格式的数据。

解封装的作用

就是将输入的封装格式的数据,分离成为音频流压缩编码数据和视频流压缩编码数据。封装格式种类很多,例如MP4,MKV,RMVB,TS,FLV,AVI等等,它的作用就是将已经压缩编码的视频数据和音频数据按照一定的格式放到一起。例如,FLV格式的数据,经过解封装操作后,输出H.264编码的视频码流和AAC编码的音频码流。

解码的作用

就是将视频/音频压缩编码数据,解码成为非压缩的视频/音频原始数据。音频的压缩编码标准包含AAC,MP3,AC-3等等,视频的压缩编码标准则包含H.264,MPEG2,VC-1等等。解码是整个系统中最重要也是最复杂的一个环节。通过解码,压缩编码的视频数据输出成为非压缩的颜色数据,例如YUV420P,RGB等等;压缩编码的音频数据输出成为非压缩的音频抽样数据,例如PCM数据。

视音频同步的作用

就是根据解封装模块处理过程中获取到的参数信息,同步解码出来的视频和音频数据,并将视频音频数据送至系统的显卡和声卡播放出来。

如何阅读官网命令行?

http://ffmpeg.org/documentation.html

可以看到贼多命令行,比如ffmpeg-all


先看下概述,找到感觉


如何查找命令行?

Ctrl+F
在这里插入图片描述


当然,金山词霸等工具少不了

阅读本文的正确姿势Ctrl+F

ffmpeg

ffmpeg是一个非常快速的视频和音频转换器,也可以从实时音频/视频源抓取信息。

ffmpeg命令的语法结构

ffmpeg [global_options] {[input_file_options] -i input_url} ...  {[output_file_options] output_url} ...  

一般规则

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

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

输入参数 -i

ffmpeg读取由 -i 选项指定的任意数量的输入“文件”(可以是常规文件、管道、网络流、设备数据流等),并写入由输出url指定的任意数量的输出“文件”。在命令行中发现的任何不能解释为选项的内容都被视为输出url。

举例如下:

#To set the video bitrate of the output file to 64 kbit/s:  ffmpeg -i input.avi -b:v 64k -bufsize 64k output.avi 
#To force the frame rate of the output file to 24 fps:  ffmpeg -i input.avi -r 24 output.avi 
#To force the frame rate of the input file (valid for raw formats only)  #to 1 fps and the frame rate of the output file to 24 fps:  ffmpeg -r 1 -i input.m2v -r 24 output.avi 

流复制 Stream copy

流复制,需要通过向-codec选项提供复制参数来选择。它使ffmpeg省略了对指定流的解码和编码步骤,因此它只进行解封装和封装。它对于更改容器格式或修改容器级元数据非常有用。在这种情况下,上面的图表将简化为:

 _______              ______________            ________ |       |            |              |          |        | | input |  demuxer   | encoded data |  muxer   | output | | file  | ---------> | packets      | -------> | file   | |_______|            |______________|          |________| 

由于没有解码或编码,它非常快,没有质量损失。然而,由于许多因素,它在某些情况下可能行不通。显然,应用滤镜也是不可能的,因为滤镜可以处理未压缩的数据。

流选择 Stream selection

自动流选择 Automatic stream selection

如果没有任何特定输出文件的映射选项,ffmpeg将检测输出格式,以检测其中可以包含哪种类型的流,即,视频、音频和/或字幕。对于每种可接受的流类型,ffmpeg将在可用时从所有输入中选择一个流。

它根据以下标准选择流:·

  • 对于视频,选择分辨率最高的流
  • 对于音频,选择有最多频道的流
  • 对于字幕,选择第一个字幕流,但有一个警告。输出格式的默认字幕编码器可以是基于文本的,也可以是基于图像的,并且只选择相同类型的字幕流。

在有几个相同类型的比特率相等的情况下,选择索引最低的流。无法自动选择数据流或附件流,只能使用-map将其包括在内。

手动流选择 Manual stream selection

当使用-map时,该输出文件中只包含用户映射的流,当然也有例外的场景。

-map

每个输入或输出url原则上可以包含任意数量的不同类型的流(视频/音频/字幕/附件/数据)。允许的流数目和/或类型受容器格式的限制。选择哪些输入的哪些流进行输出,要么自动完成,要么使用-map选项。

文件选择和流选择 [2:3]

若要引用选项中的输入文件,必须使用它们的索引(基于0的)。例如:第一输入文件为0,第二输入文件为1等。类似地,文件中的流由它们的索引引用。例如:2:3指第三个输入文件中的第四个流。

流选择 -vn/-an/-sn/-dn

ffmpeg为手动控制每个输出文件中的流选择提供了-map选项。用户可以不使用-map,让ffmpeg执行自动流选择,
如下所述。
无论是手动映射还是自动选择,除了复杂滤波图的输出流,选项-vn/-an/-sn/-dn可分别用于跳过包括视频、音频、字幕和数据流。

下面的例子说明FFmpeg的流选择方法的行为、怪癖和限制

input file 'A.avi'       stream 0: video 640x360       stream 1: audio 2 channels input file 'B.mp4'       stream 0: video 1920x1080       stream 1: audio 2 channels       stream 2: subtitles (text)       stream 3: audio 5.1 channels       stream 4: subtitles (text) input file 'C.mkv'       stream 0: video 1280x720       stream 1: audio 2 channels       stream 2: subtitles (image) 
ffmpeg -i A.avi -i B.mp4 out1.mkv out2.wav -map 1:a -c:a copy out3.mov 

指定了三个输出文件,对于前两个,无-map选项,因此ffmpeg将自动为这两个文件选择流。

out1.mkv是一个高清格式文件,接受视频、音频和字幕流,因此ffmpeg将尝试选择每种类型中的一种。对于视频,它将从b.mp4中选择流0,因为它在所有输入视频流中具有最高的分辨率。对于音频,它将从b.mp4中选择流3,因为它有最多的频道。对于字幕,它将从b.mp4中选择流2,这是a.avib.mp4中的第一个字幕流。

输出2.wav只接受音频流,因此只选择b.mp4中的流3

对于out3.mov,由于设置了-map选项,因此不会出现自动流选择。-map 1:a选项将从第二个输入b.mp4中选择所有音频流。此输出文件中不会包含其他流。

对于前两个输出,所有包含的流都将被转码。所选择的编码器将是由每种输出格式注册的默认编码器,这可能与所选输入流的编解码器不匹配。

对于第三个输出,音频流的codec选项(-c:a)已设置为复制,因此不会发生或可能发生解码-滤镜-编码操作。所选流的packets编码数据包从输入文件中传输,然后封装到输出文件中。

自动字幕流选择 automatic subtitles selection

ffmpeg -i C.mkv out1.mkv -c:s dvdsub -an out2.mkv 

虽然out1.mkv是一个接受字幕流的高清格式文件,但只能选择一个视频和音频流。C.mkv的字幕流是基于图像的,mkv 封装器的默认字幕编码器是基于文本的,因此字幕的转码操作预计会失败,因此不会选择流。

但是,在out2.mkv中,命令中指定了字幕编码器,因此,除了视频流之外,还选择了字幕流。out2.mkv-an禁用音频流的选择。

不加标签的滤镜输出 unlabeled filtergraph outputs

ffmpeg -i A.avi -i C.mkv -i B.mp4 -filter_complex "overlay" out1.mp4 out2.srt 

这里使用-filter_complex选项设置了一个滤镜,它由一个视频滤镜组成。overlay滤镜需要两个视频输入,但没有指定,因此使用了前两个可用的视频流,即a.avic.mkv的视频流。滤镜的输出面板没有标签,因此被传递到第一个输出文件out1.mp4。因此,将跳过视频流的自动选择,这将选择b.mp4中的视频流。具有最多数量频道的音频流,即b.mp4中的流3,会被自动选择。但是没有选择字幕流,因为MP4格式没有默认的字幕编码器注册,而且用户没有指定字幕编码器。

第二个输出文件out2.srt只接受基于文本的字幕流。因此,尽管可用的第一个字幕流属于c.mkv,但它是基于图像的,因此跳过了。选定的流,b.mp4中的流2,是第一个基于文本的字幕流。

带标签的滤镜输出labeled filtergraph outputs

ffmpeg -i A.avi -i B.mp4 -i C.mkv -filter_complex  "[1:v]hue=s=0[outv];overlay;aresample" \        -map '[outv]' -an        out1.mp4 \                                 out2.mkv \        -map '[outv]' -map 1:a:0 out3.mkv 

以上命令将失败,因为标记为[outv]的输出标签已被映射两次。不处理任何输出文件。

ffmpeg -i A.avi -i B.mp4 -i C.mkv -filter_complex  "[1:v]hue=s=0[outv];overlay;aresample" \        -an        out1.mp4 \                   out2.mkv \        -map 1:a:0 out3.mkv 

上面的命令也会失败,因为色调滤镜输出有一个标签[outv],并且没有被映射到任何地方。

应修改为如下命令:

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 

来自b.mp4的视频流被发送到色调滤镜,其输出使用分割滤镜被克隆一次,并且这两个输出都有标签。然后,将每个副本映射到第一和第三输出文件。

overlay滤镜需要两个视频输入,使用前两个未使用的视频流。这些是来自a.avic.mkv的流。overlay 输出没有标签,因此它被传递到第一个输出文件out1.mp4,而不考虑-map选项的存在。

aresample滤镜被应用给第一个未使用的音频流,即a.avi的音频流。因为这个滤镜输出也没有标签,所以它也被映射到第一个输出文件。-an选项会抑制音频流的自动或手动选择,而不是从滤镜获取输出。这两个映射流都应在输出1.mp4中的映射流之前排序。

映射到out2.mkv的视频、音频和字幕流完全由自动流选择决定。

out3.mkv由来自色调滤镜克隆的视频输出和来自b.mp4的第一个音频流组成。

选项Options

流说明符 Stream specifiers

有些选项应用于每个流,例如比bitrate比特率 或编解码器codec。流说明符用于精确指定给定选项所属的流。流说明符是通常附加到选项名称并由冒号分隔的字符串。例如a:1 ac3包含与第二音频流匹配的a:1流说明符。因此,它将为第二音频流选择ac3编解码器。流说明符可以匹配多个流,以便将该选项应用到所有流。例如-b:a 128K匹配所有音频流。空的流说明符匹配所有流。例如,-codec copy-codec: copy复制所有流,而无需重新编码。

流说明符的可能形式是:

流索引 stream_index

将流与索引匹配。例如:-threads:1 4将第二流的线程数量设置为4。如果使用stream_index作为附加的流说明符(见下文),那么它将从匹配的流中选择流号stream_index。流编号是基于libavformat 检测到的流的顺序,除非 program ID也被指定,在这种情况下,它是基于程序中流的排序。

stream_type[:additional_stream_specifier]

stream_type是以下内容之一:vV,用于视频,a用于音频,s用于字幕,d用于数据,而t用于附件。v匹配所有视频流,V仅匹配未连接图片、视频缩略图或封面艺术的视频流。如果使用了附加流说明符,则它匹配具有和此类型以及附加流说明符匹配的流。否则,它与指定类型的所有流匹配。

通用选项 Generic options

这些选项在ff*工具上都可使用。
-L
显示版权信息
-h-?-help--help[arg]
显示帮助信息。可以指定可选参数来打印有关特定项目的帮助。如果未指定参数,则仅显示基本(非高级)工具选项。

arg的可能值包括:

long

除了基本工具选项外,还可以打印高级工具选项。

full

打印完整的选项列表,包括encoders编码器、decoders解码器、demuxers解封装器、muxers封装器、滤镜等的共享和私有选项。

decoder=decoder_name

打印指定解码器的详细信息。使用-decoders选项打印所有解码器的列表。

encoder=encoder_name

打印指定编码器的详细信息。使用-encoders选项打印所有编码器。

demuxer=demuxer_name

打印指定demuxer 的详细信息。使用-format选项打印所有demuxersmuxers

muxer=muxer_name

打印指定muxer 的详细信息。使用-format选项打印所有demuxersmuxers

filter=filter_name

打印指定滤镜的详细信息。使用-filters选项打印所有滤镜。

bsf=bitstream_filter_name

打印指定位流滤镜的详细信息。使用-bsfs选项打印所有位流滤镜。

-version

显示版本信息

-formats

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

-demuxers

显示可用的demuxers解封装器

-muxers

显示可用的muxers封装器

-devices

显示可用的设备devices

-codecs

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

-decoders

显示可用的解码器decoders

-encoders

显示可用的编码器encoders

-bsfs

显示可用的位流滤镜bitstream filters

-protocols

显示可用的协议

-filters

显示libavfilter 中可用的滤镜

-pix_fmts

显示可用的像素格式

-sample_fmts

显示可用的采样格式。

-layouts

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

-colors

显示可识别的颜色名称。

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

显示输入设备的自动检测源。一些设备可以提供无法自动检测的依赖于系统的源名称。返回的列表不一定总是完整的。

ffmpeg -sources pulse,server=192.168.0.4 

-sinks device[,opt1=val1[,opt2=val2]…]

显示输出设备的自动检测接收器。有些设备可能提供无法自动检测到依赖于系统的接收器名称。返回的列表不一定是完整的。

ffmpeg -sinks pulse,server=192.168.0.4 

-loglevel [flags+]loglevel | -v [flags+]loglevel

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

可选标志前缀可以由以下值组成:

repeat

Indicates that repeated log output should not be compressed to the first  line and the "Last message repeated n times" line will be omitted.  

指示不应将重复日志输出压缩到第一行,并且…

level

指示日志输出应在每条消息行中添加一个[level]前缀。这可以用作日志着色,例如,当将日志转储到文件中时。

Flags can also be used alone by adding a ’+/-’ prefix to set/reset a single flag without affecting  other flags or changing loglevel. When setting both flags and loglevel, a ’+’ separator  is expected between the last flags value and before loglevel.  

也可以通过添加+/-前缀来单独使用标志,以设置/重置单个标志,而不影响其他标志或更改日志级别。设置“标志”和“LogLevel”时,在最后一个标志值和LogLevel之前都会有一个+分隔符。

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

quiet, -8

不输出任何信息

panic, 0

只显示可能导致进程崩溃的致命错误,例如断言失败。目前没有用于任何地方。

fatal, 8

只显示致命的错误。这些错误出现在进程绝对不能继续下去的时候。

error, 16

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

warning, 24

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

info, 32

在处理期间显示信息级别的消息,这是默认值。

verbose, 40

和信息级别一样,但是更冗长。

debug, 48

显示所有内容,包括调试信息。

例如,要启用重复的日志输出,添加级别前缀,并将日志级别设置为verbose

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

在不影响级别前缀标志或日志级别的当前状态的情况下启用重复日志输出的另一个示例:

ffmpeg [...] -loglevel +repeat 

默认情况下,程序记录到stderr。如果终端支持着色,则使用颜色标记错误和警告。可以禁用日志着色,设置环境变量AV_LOG_FORCE_NOCOLORNO_COLOR,也可以强制设置环境变量AV_LOG_FORCE_COLOR。不推荐使用环境变量NO_COLOR,并将在以后的ffmpeg版本中删除。

AVOptions

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

通用选项generic

可以为任何文件格式、编解码器或设备设置这些选项。通用选项在用于文件格式/设备的AVFormatContext选项下,并在编解码器的AVCodecContext上下文选项下列出。

私有选项private

这些选项特定于给定的文件格式、设备或编解码器。相应的文件格式/设备/编解码器下列出了私有选项。

例如,要将id3v2.3头而不是默认的id3v2.4写入mp3文件,使用mp3 muxer的id3v2_version私有选项:

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

所有编解码器的AVOptions都是应用于每个流的,因此应该附加一个流说明符:

ffmpeg -i multichannel.mxf -map 0:v:0 -map 0:a:0 -map 0:a:0 -c:a:0 ac3 -b:a:0 640k  -ac:a:1 2 -c:a:1 aac -b:2 128k out.mp4 

在上面的例子中,一个多声道音频流被映射两次以便输出。第一个实例由编码器ac3指定比特率640 k编码。第二个实例被降至2个信道,并使用编码器aac编码。使用输出流的绝对索引为它指定128 k的比特率。

注意:-nooption语法不能用于布尔选项,请使用 -option 0/-option 1.

注意:通过在选项名称前面加上v/a/s来指定每个流的AVOptions的旧的无文档化方法现在已经过时,并将很快被删除。

主要选项 Main options

-f fmt (input/output)

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

-i url (input)

输入文件的url

-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或者c填值解码器/编码器的名称,codec或者c填值copy,表示(仅输出),以指示流不被重新编码。

举例:

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

用libx264对所有视频流进行编码,并复制所有音频流。

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

复制所有流,除了将用libx264编码的第2个视频流和将用libvorbis编码的第138个音频流。

-t duration (input/output)

-to position (input/output)

当用作输入选项(在-i之前)时,限制从输入文件读取数据的持续时间。当用作输出选项时(在输出url之前),在输出持续时间达到持续时间后停止写入输出。duration 必须是时间期限规范,请参阅(ffmpeg-utils)在ffmpeg-utils(1)手册中的时间duration 部分。-to-t是相互排斥的,-t有优先权。

-fs limit_size (output)

设置文件大小限制,以字节表示。超过限制后,不再写入更多的字节块。输出文件的大小略大于请求的文件大小。

-ss position (input/output)

当用作输入选项(-i之前)时,在此输入文件中定位位置。请注意,在大多数格式中,不可能精确地寻找,因此ffmpeg将在位置之前定位到最接近的点。当启用转码transcoding 和-精确定位-accurate_seek(默认)时,seek pointposition 之间的这个额外段将被解码和丢弃。当做流复制或当使用 -noaccurate_seek 的寻求时,它将被保存。

当用作输出选项时(在输出url之前),解码但丢弃输入,直到时间戳到达位置。位置必须是time duration规范,请参阅(ffmpeg-utils)在ffmpeg-utils(1)手册中的time duration部分。

-sseof position (input)

Like the -ss option but relative to the "end of file".  That is negative values are earlier in the file, 0 is at EOF.  

-ss选项类似,但相对于"文件结束"。这是文件中较早的负值,0EOF

-itsoffset offset (input)

设置输入时间偏移。偏移量必须是 time duration 规范,参见FFmpeg-utils(1)手册中的 time duration 部分。将偏移添加到输入文件的时间戳中。指定正偏移意味着对应的流被延迟指定的持续时间。

-itsscale scale (input,per-stream)

重新调整输入时间戳。scale 用浮点数。

-timestamp date (output)

在文件格式容器中设置记录时间戳。日期必须是日期规格,请参阅FFmpeg-utils(1)手册中的日期部分。

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

设置元数据 key/value对。
可以给出可选的元数据_说明符以在流、章节或程序上设置元数据。有关详细信息,请参见
-map_metadata文档。
此选项将覆盖带有-map_metadata的元数据集。也可以通过使用空的值来删除元数据。
例如,用于在输出文件中设置标题:

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

要设置第一个音频流的语言,请执行以下操作:

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

-dn (input/output)

作为输入选项,阻止文件的所有数据流被过滤或被自动选择或映射到任何输出。请参见-discard选项以单独禁用流。作为输出选项,禁用数据,即任何数据流的自动选择或映射。有关完整的手动控制,请参见-map选项。

-frame:d

设置要输出的数据帧数。

-frames[:stream_specifier] framecount (output,per-stream)

在framecount 个帧之后停止写入流。


本文将持续更新,敬请关注

欢迎分享、转载、联系、指正、批评、撕逼

Github:https://github.com/AnJiaoDe

简书:https://www.jianshu.com/u/b8159d455c69

CSDN:https://blog.csdn.net/confusing_awakening

ffmpeg入门教程:https://www.jianshu.com/p/042c7847bd8a

微信公众号

QQ群

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!