赞
踩
ffmpeg [global_options] {[input_file_options] -i input_url} ... {[output_file_options] output_url} ...
ffmpeg是一款非常快速的视频和音频转换器,可以从音频/视频源获取。 它还可以在任意采样率之间转换,并通过高质量的多相滤波器实时调整视频大小。ffmpeg 可以从任意输入“文件”读取(可以是常规文件,管道,网络流,抓取设备等),由 -i 指定输入;并写入任意的输出“文件”。任何在命令行中不能被解析的选项都会被认为是输出url。
原则上,每个输入或输出 url 都可以包含任意数量的不同类型的视频流(视频/音频/字幕/附件/数据)。流的类型/数量可能受容器格式的限制。选择某种输入流将自动确定某种输出,或者使用 -map 选项指定(参见流选择章节)。
要引用选项中的输入文件,您必须使用它们的索引(从0开始)。 例如。 第一个输入文件是0,第二个是1等。类似的,文件中的流也是使用索引引用。例如, 2:3是指第三个输入文件中的第四个流。(参阅流说明符一章)
一般规则,选项将应用于下一个指定的文件。因此,顺序很重要,您可以多次在命令行上使用相同的选项,然后将每一个选项应用于下一个输入或输出文件。例外:全局选项(例如verbosity level),应该首先指定它们。
将输出文件的视频比特率设置为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中转换过程可以用下图来描述:
_______ ______________ | | | | | input | demuxer | encoded data | decoder | file | ---------> | packets | -----+ |_______| |______________| | v _________ | | | decoded | | frames | |_________| ________ ______________ | | | | | | | output | <-------- | encoded data | <----+ | file | muxer | packets | encoder |________| |______________|
ffmpeg调用libavformat库(包含demuxers)来读取输入文件并获取包含编码数据的数据包。当由多个输入文件时,ffmpeg会尝试通过跟踪输入流上的最低时间戳来使它们同步。
然后将编码的数据包传递给解码器(除非为数据流选择了流拷贝,请参阅进一步的描述)。解码器产生未压缩的帧(原始视频/ PCM音频/ ...),再过滤做进一步处理(参见下一节)。在过滤之后,帧被传递给编码器,编码器对其进行编码并输出编码包(encoded data packets)。 最后,这些被传递给复用器( muxer ),它将编码的数据包写入输出文件。
在编码之前,ffmpeg可以使用libavfilter库中的过滤器处理原始音频和视频帧。几个链式过滤器形成一个滤镜(filter graph)。 ffmpeg分两种类型的滤镜:简单和复杂。
简单滤镜就是那些只有一个输入和输出,都是相同类型的滤镜。 在上图中,它们可以通过简单地在解码和编码之间插入额外的步骤来表示:
_________ ______________ | | | | | decoded | | encoded data | | frames |\ _ | packets | |_________| \ /||______________| \ __________ / simple _\|| | / encoder filtergraph | filtered |/ | frames | |__________|
简单滤镜配置了流 -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
filter),它有两个视频输入和一个视频输出,其中包含一个叠加在另一个之上的视频。 它的音频对应是amix滤波器。
流拷贝是通过将拷贝参数提供给 -codec 选项来选择的模式。 它使ffmpeg省略了指定流的解码和编码步骤,因此它只进行解复用和混合(demuxing and muxing)。 这对于更改容器格式或修改容器级元数据很有用。 在这种情况下,上图将简化为:
_______ ______________ ________ | | | | | | | input | demuxer | encoded data | muxer | output | | file | ---------> | packets | -------> | file | |_______| |______________| |________|由于没有解码或编码,因此速度非常快,并且没有质量损失。 但是,由于许多因素,它在某些情况下可能不起作用,因为过滤器只对未压缩的数据起作用。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。