优秀的编程知识分享平台

网站首页 > 技术文章 正文

FFmpeg的基本组成

nanyue 2024-12-05 15:03:24 技术文章 9 ℃

FFmpeg基本由 七 个模块组成,分别是:AVFormat、AVCodec、AVFilter、AVDevice、AVUtil、swresample、swscale。

  • AVFormat是封装模块:主要负责音视频文件的输入和输出。它的主要功能是对多媒体文件的格式进行解封装(demuxing)和封装(muxing)

解封装(Demuxing):从多媒体文件中提取音频、视频、字幕等流。FFmpeg 可以处理多种格式的封装文件,如 MP4、MKV、AVI 等。

封装(Muxing):将音频、视频流等数据重新封装成一个多媒体文件。比如将编码后的音频和视频流封装到 MP4 文件中。

  • AVCodec是编解码模块:它包含了各种编码器和解码器,用于对音频和视频进行压缩和解压缩。

解码(Decoding):将压缩的音频或视频流(如 H.264、AAC 等格式)解码成原始的音频或视频帧(YUV、PCM 等)。

编码(Encoding):将原始音频或视频帧编码为压缩的格式,如将 RGB 视频转换为 H.264 格式的视频流,或将 PCM 音频转换为 AAC 格式的音频流。

  • AVFilter是滤镜模块:提供了多种滤镜(filters),可以实现通用的音频、视频、字幕等滤镜处理,可以在解码、编码或封装过程中对音视频数据进行处理。

视频处理:对视频进行各种处理,如缩放、裁剪、旋转、色彩调整等。

音频处理:对音频进行处理,如音量调节、混音、效果处理等。

过滤链(Filterchains):多个滤镜可以组成一个处理链,用于对输入数据进行复杂的处理。

在AVFilter中,滤镜框架可以有多个输入和多个输出,比如下面:

上图中的含义是:处理视频文件,对视频进行裁剪、翻转,并将处理后的部分覆盖到原视频的下半部分,生成一个新的输出视频。

#操作的命令如下:
ffmpeg -i /mnt/e/498312bdc286584c6e01571dd6087bc4.mp4 -vf "split [main][tmp]; [tmp] crop=iw:ih/2:0:0, vflip [flip]; [main][flip] overlay=0:H/2" /mnt/e/output.mp4
#命令行解释
## -i用于指定输入的要处理的视频文件
## -vf 是用于指定视频滤镜(video filter)的选项,后面的内容是一个复合滤镜链(filter chain),定义了一系列视频处理操作。它包含了多个视频滤镜,分号 ; 用于分隔每个滤镜的操作。
###滤镜链的解释:
####split [main][tmp]
						split 滤镜将输入视频分为两个相同的流,分别命名为 [main] 和 [tmp]。
						[main] 是视频的主流,不做任何更改,将继续用于后续的处理。
						[tmp] 是副本,稍后会进行裁剪和翻转。
#####[tmp] crop=iw:ih/2:0:0, vflip [flip]
						[tmp] 代表的是被 split 操作拆分出来的视频副本。
						crop=iw:ih/2:0:0:这个 crop 滤镜裁剪视频:
											iw 是输入视频的宽度(input width)。
											ih/2 是输入视频的高度的一半,表示裁剪到上半部分。
											0:0 表示从左上角坐标 (0, 0) 开始裁剪。
						vflip:这个滤镜将裁剪后的视频进行垂直翻转(vertical flip)。
											[flip]:翻转后的视频流被命名为 [flip],将用于后续的叠加操作。
#####[main][flip] overlay=0:H/2
						[main] 是原始视频流。
						[flip] 是翻转后的裁剪视频流。
						overlay=0:H/2:这个 overlay 滤镜将翻转后的裁剪视频叠加到原始视频上,具体的叠加位置由 overlay 参数决定:
						0 表示翻转视频的左上角横坐标为 0,即在原始视频的左边对齐。
						H/2 表示翻转视频的纵坐标为原始视频的高度的一半(H 是原始视频的高度),即将翻转视频叠加到原始视频的下半部分。
##/mnt/e/output.mp4
最后,指定输出文件的路径 /mnt/e/output.mp4,将处理后的视频保存到该路径。

效果如下:

简单总结一下,滤镜的使用规则:

(1)相同的Filter线性链之间用逗号分隔

(2)不同的Filter线性链之间用分号分隔

在上面的例子中,crop和vflip使用的是同一个滤镜处理的线性链,而split滤镜和overlay则使用了另外的线性链,一个线性链与另外的线性链汇合时是通过方括号“[]”括起来的标签进行标识的。在本例中,处理后的两个流是通过[main]与[flip]进行关联汇合的。

split滤镜将分隔后的视频流的副本打上标签[tmp],通过crop滤镜对该部分流进行处理,然后进行纵坐标调换操作,打上[flip]标签,最终将[main]标签与[flip]标签进行合并,[flip]标签的视频流从视频的左边最中间的位置开始显示,这样就出现了镜像的效果。

  • AVDevice负责设备输入输出模块:它处理与硬件设备(如摄像头、麦克风、屏幕等)交互的操作,支持捕获和播放音视频流。

设备捕获:用于从摄像头、麦克风等设备捕获音视频数据。

设备播放:用于向显示设备或音频输出设备播放音视频数据。

常用的接口:

avdevice_register_all(): 注册所有可用的设备。

avdevice_capabilities_create(): 获取设备的支持能力。

avformat_open_input(): 用于打开输入设备,如摄像头、麦克风等。

  • AVUtil工具模块:提供了音视频处理的各种基础功能,包括数据结构、编解码器信息、时间处理等。

数据结构:定义了用于存储音视频数据的结构体,如 AVFrame(存储音视频帧)、AVPacket(存储音视频数据包)、AVCodecContext(编解码器上下文)。

时间与时长:提供时间处理的功能,如帧率、时间基准转换等。

内存管理:提供内存分配、释放等基础功能。

  • swresample音频转换计算模块:

提供了高级的音频重采样API,for example,允许操作音频采样、音频通道布局转换与布局调整。

  • swscale视频图像转换计算模块:

提供了高级的图像转换API,比如允许进行图像缩放和像素格式转换,常见的是将图像从1080p转换为720p或者480p等等的缩放。或者将图像数据从YUV420P转换为YUYV,或者YUV转RGB等格式图像转换,这些转换接口,与OpenCV中的图像颜色空间转换接口有异曲同工之妙。

最近发表
标签列表