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_specifier] codec (input/output,per-stream)
-codec[:stream_specifier] codec (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_specifier] framecount (output,per-stream) Stop writing to the stream after framecount frames.
-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 并使用它来过滤流。
-filter_script[:stream_specifier] filename (output,per-stream) 此选项类似于 -filter,唯一的区别是它的参数是要从中读取 filtergraph 描述的文件的名称
-reinit_filter[:stream_specifier] integer (input,per-stream)
-filter_threads nb_threads (global) 定义用于处理过滤器管道的线程数。每个管道都会产生一个线程池,其中有这么多线程可用于并行处理。默认值是可用 CPU 的数量
-pre[:stream_specifier] preset_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_specifier] filename (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_specifier] fps (input/output,per-stream) 设置帧速率
-fpsmax[:stream_specifier] fps (output,per-stream) 设置最大帧速率
-s[:stream_specifier] size (input/output,per-stream)
设置帧大小
-aspect[:stream_specifier] aspect (output,per-stream) 设置 aspect 指定的视频显示宽高比。-vn (input/output) 作为输入选项,阻止文件的所有视频流被过滤或被自动选择或映射以用于任何输出 作为输出选项,禁用视频录制,即自动选择或映射任何视频流。
-vcodec codec (output) 设置视频编解码器。这是 -codec:v 的别名。
-pass[:stream_specifier] n (output,per-stream)
选择通行证编号(1 或 2)。它用于进行两遍视频编码。视频的统计信息在第一次传递中记录到日志文件中(另请参见选项 -passlogfile),在第二次传递中,该日志文件用于以确切请求的比特率生成视频。在第 1 阶段,您可以只停用音频并将输出设置为 null,Windows 和 Unix 的示例:
-passlogfile[:stream_specifier] prefix (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