ffmpeg 常用命令

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ffmpeg 常用命令相关的知识,希望对你有一定的参考价值。

参考技术A FFMPEG是特别强大的专门用于处理音视频的开源库。你既可以使用它的API对音视频进行处理,也可以使用它提供的工具,如 ffmpeg, ffplay, ffprobe,来编辑你的音视频文件。
本文将简要介绍一下 FFMPEG 库的基本目录结构及其功能,然后详细介绍一下我们在日常工作中,如何使用 ffmpeg 提供的工具来处理音视频文件。

在讲解 FFMPEG 命令之前,我们先要介绍一些音视频格式的基要概念。

我们按使用目的可以将 FFMPEG 命令分成以下几类:

然后将编码的数据包传送给解码器(除非为数据流选择了流拷贝,请参阅进一步描述)。 解码器产生未压缩的帧(原始视频/ PCM音频/ ...),可以通过滤波进一步处理(见下一节)。 在过滤之后,帧被传递到编码器,编码器并输出编码的数据包。 最后,这些传递给复用器,将编码的数据包写入输出文件。

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

您可以通过使用-vn / -an / -sn / -dn选项来禁用某些默认设置。 要进行全面的手动控制,请使用-map选项,该选项禁用刚描述的默认设置。
下面我们就来详细介绍一下这些命令。

FFMPEG 可以使用下面的参数进行基本信息查询。例如,想查询一下现在使用的 FFMPEG 都支持哪些 filter,就可以用 ffmpeg -filters 来查询。详细参数说明如下:

接下来介绍的是 FFMPEG 处理音视频时使用的命令格式与参数。

下面是 FFMPEG 的基本命令格式:

ffmpeg 通过 -i 选项读取输任意数量的输入“文件”(可以是常规文件,管道,网络流,抓取设备等,并写入任意数量的输出“文件”。
原则上,每个输入/输出“文件”都可以包含任意数量的不同类型的视频流(视频/音频/字幕/附件/数据)。 流的数量和/或类型是由容器格式来限制。 选择从哪个输入进入到哪个输出将自动完成或使用 -map 选项。
要引用选项中的输入文件,您必须使用它们的索引(从0开始)。 例如。 第一个输入文件是0,第二个输入文件是1,等等。类似地,文件内的流被它们的索引引用。 例如。 2:3是指第三个输入文件中的第四个流。
上面就是 FFMPEG 处理音视频的常用命令,下面是一些常用参数:

-an(输出) 禁用录音。
-acodec编解码器(输入/输出) |设置音频编解码器。这是-codec的别名:a。
-sample_fmt [:stream_specifier] sample_fmt(输出,每个流) |设置音频采样格式。使用-sample_fmts获取支持的样本格式列表。
-af filtergraph(输出) |创建由filtergraph指定的过滤器图,并使用它来过滤流。

了解了这些基本信息后,接下来我们看看 FFMPEG 具体都能干些什么吧。

首先通过下面的命令查看一下 mac 上都有哪些设备。

注意,桌面的输入对帧率没有要求,所以不用限制桌面的帧率。其实限制了也没用。

ffmpeg -f avfoundation -i 1:0 -r 29.97 -c:v libx264 -crf 0 -c:a libfdk_aac -profile:a aac_he_v2 -b:a 32k out.flv

流拷贝是通过将 copy 参数提供给-codec选项来选择流的模式。它使得ffmpeg省略了指定流的解码和编码步骤,所以它只能进行多路分解和多路复用。 这对于更改容器格式或修改容器级元数据很有用。 在这种情况下,上图将简化为:

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

上面的命令表式的是音频、视频都直接 copy,只是将 mp4 的封装格式转成了flv。

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

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

简单的filtergraphs配置了per-stream-filter选项(分别为视频和音频使用-vf和-af别名)。 一个简单的视频filtergraph可以看起来像这样的例子:

请注意,某些滤镜会更改帧属性,但不会改变帧内容。 例如。 上例中的fps过滤器会改变帧数,但不会触及帧内容。 另一个例子是setpts过滤器,它只设置时间戳,否则不改变帧。

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

复杂的过滤器图使用-filter_complex选项进行配置。 请注意,此选项是全局性的,因为复杂的过滤器图形本质上不能与单个流或文件明确关联。
-lavfi选项等同于-filter_complex。
一个复杂的过滤器图的一个简单的例子是覆盖过滤器,它有两个视频输入和一个视频输出,包含一个视频叠加在另一个上面。 它的音频对应是amix滤波器。

先通过 ffplay 找到要删除 LOGO 的位置

使用 delogo 滤镜删除 LOGO

crop 格式:crop=out_w:out_h:x:y

如果要修改为垂直翻转可以用vflip。

首先创建一个 inputs.txt 文件,文件内容如下:
file '1.flv'
file '2.flv'
file '3.flv'
然后执行下面的命令:

FFMPEG常用命令:图片相关命令

FFMPEG常用命令(一):音视频信息与抽取
FFMPEG常用命令(二):视频相关命令
FFMPEG常用命令(三):音频相关命令
FFMPEG常用命令(四):图片相关命令
FFplay常用命令
FFprobe常用命令

上一篇文章我们学习了FFmpeg音频相关的命令,本篇文章我们来学习FFmpeg图片相关的命令。

准备工作

和上一篇文章一样,我们准备一个Res文件夹,在里面放一个视频文件(video.mp4,一分钟左右)和一张图片文件(image.jpg)。然后在这个文件夹打开命令行。

接着我们了解一下YUV,YUV是图片的一种编码方式,Y指明亮度,U和V指色度,用于表示像素的颜色。常见的YUV采样有三种,分别是YUV444、YUV422 及 YUV420。

YUV444是指每个像素点都有自己的Y值、U值和V值,如下图。

YUV422是指每个像素点都有自己的Y值,但水平方向每两个像素共用U值和V值。

YUV420是指每个像素点都有自己的Y值,但每横竖四个像素共用U值和V值。

因此同样一张图片采用不同的采样方式,体积大小 YUV444 > YUV422 > YUV420。

图片间转换命令

将jpeg格式转换为yuv格式命令如下,-pix_fmt 用于设置像素格式,除了yuv444p,还有yuv422p、yuv420p等。

ffmpeg -i image.jpg -pix_fmt yuv444p out444.yuv

YUV文件都很大,那是因为yuv是原始格式。

反过来也可以转换。命令如下。注意,-s 设置尺寸是必须的(原图片是409x470),而且要写在 -i 前面。其次,尺寸写错很有可能会输出花屏图片。

ffmpeg -s 409x470 -i out444.yuv result.jpg

(呃…打印机又没墨了?)那是因为上面的命令没有设置像素格式,默认使用了yuv420p。

第一张是原图,第二张是YUV444图片使用了yuv420p,第三张是因为尺寸输入错误(300x300)。

设置好像素格式即可。注意,-s 和 -pix_fmt 都要写在 -i 前面。

ffmpeg -s 409x470 -pix_fmt yuv444p -i out444.yuv result.jpg

当然我们还可以把图片转换为其他格式。常见的格式有jpeg、bmp、gif、png等。

ffmpeg -i image.jpg result.bmp

视频与yuv命令

如下命令可以把MP4视频转换为yuv文件。注意!!! 视频长度最好不要超过1分钟!yuv是原始文件,体积是相当大的。原视频只有不到6MB,可是yuv文件却接近1GB。

ffmpeg -i video.mp4 -pix_fmt yuv444p out.yuv


yuv转换回原视频也是可以的,不过必须设置对采样方式、视频尺寸和帧率。

原视频尺寸是640x360,帧率是23.96,out.yuv采样方式是yuv444p。-s 、-pix_fmt 要写在 -i 前面。-r 设置帧率。

ffmpeg -s 640x360 -pix_fmt yuv444p -i out.yuv -r 23.96 result.mp4

出现如下的闪屏、花屏,是因为-pix_fmt 设置错误导致的。视频看起来卡顿是因为-r 设置的帧率比原视频小太多。

视频转图片

视频本质上就是一张张的图片快速切换得来的。通过FFmpeg,我们也可以把一个视频还原成一张张的图片。视频转图片命令如下。-ss 表示开始时间(秒),-t 表示持续时间(秒),-r 表示帧率,-r 1 表示每秒截一张图。-r 2 则表示每秒截两张图。result%d.jpg 表示输出图片集的名字。

ffmpeg -i video.mp4 -ss 5 -t 10 -r 1 result%d.jpg


也可以把图片集重新合成视频。命令如下,-r 和 -t 要写在 -i 前面。(ppt视频…)

ffmpeg -r 1 -t 10 -i result%d.jpg result.mp4

最后

本篇文章讲述了FFmpeg图片间、视频-yuv、视频-图片的相关命令。

参考文章

《ffmpeg图片与视频命令笔记》
《ffmpeg把yuv数据转换成jpeg图片》
《使用FFmpeg生成YUV视频文件并播放(通过命令的方式)》
《如何使用FFmpeg将视频转成图片_图片转成视频》

以上是关于ffmpeg 常用命令的主要内容,如果未能解决你的问题,请参考以下文章

ffmpeg常用基本命令(转)

FFmpeg常用推流命令

FFmpeg常用基本命令

ffmpeg常用的命令记录

FFmpeg常用命令流媒体命令

ffmpeg常用命令