文章目录
- 一、FFmpeg 库结构
- 1、FFmpeg 库的结构总体概览
- 2、AVUtil 库
- 3、AVFormat 库
- 4、AVCodec 库
- 5、AVFilter 库
- 6、SWScale 库
- 7、SwrRessample 库
- 8、PostProc 库
- 9、AVDevice 库
一、FFmpeg 库结构
1、FFmpeg 库的结构总体概览
FFmpeg 库的结构如下 :
ffplay , ffprobe , ffmpeg 是三个可执行程序 , 对应的 main 函数入口代码分别是 ffplay.c , ffprobe.c , ffmpeg.c ;
libavformat 库
libavcodec 库
- 在上图中 , libavcodec 库 又依赖很多 编解码器相关的库 , 如 fdk-aac 是 音频编解码相关的库 ;
- FFmpeg 库中 不包含 具体的编解码器的库 , 在编译 FFmpeg 源码时 , 需要 配置支持哪些编解码器 , 配置后会下载对应的源码 ;
- 先编译 依赖库的源码 , 然后将编译结果组合到 FFmpeg 源码中一起进行编译 ;
libavfilter 库 负责 对音视频流进行 过滤处理
libswscale 库
libswresample 库
2、AVUtil 库
AVUtil 库 ( libavutil ) 是一个 辅助核心工具库
- 时间戳处理
- 哈希运算
- 数学运算
- 位流操作
- 内存管理
- AVFrame 管理
- AVPacket 管理
- 编解码辅助工具
等 , FFmpeg 的 其它库都会依赖该库 , 使用该工具库提供的基础算法服务 ;
举例说明 : AVFrame 结构体对象的 内存分配和释放 的函数 ,
av_frame_alloc();
av_frame_free();
就定义在 AVUtil 库中 ;
3、AVFormat 库
AVFormat 库 ( libavformat ) 负责 处理各种媒体容器格式 , 是 文件格式 和 协议库 , 该库中 封装了 协议层 和 复用器 / 解复用器 等相关功能 ;
该库封装了协议格式相关的功能 , 使得 协议和格式 对开发者透明 ;
FFmpeg 的开发者和使用者 , 可以直接使用 FFmpeg 进行音视频处理 , 不需要关心处理的音视频是什么格式的 ;
如下命令所示 , 使用 ffmpeg 命令处理音视频时 , 不需要考虑音视频格式问题 , FFmpeg 的 AVFormat 库 会为我们处理好格式相关的问题 , 使用者不需要关心格式问题 ;
ffmpeg -i input.h264 -i input.aac -c:v copy -c:a copy -f mp4 output.mp4
4、AVCodec 库
AVCodec 库 ( libavcodec ) 封装了 FFmpeg 的 Codec层 的一系列编解码逻辑 , 负责处理各种音视频格式的编码和解码 ;
libavcodec 库
- 在上图中 , libavcodec 库 又依赖很多 编解码器相关的库 , 如 fdk-aac 是 音频编解码相关的库 ;
- FFmpeg 库中 不包含 具体的编解码器的库 , 在编译 FFmpeg 源码时 , 需要 配置支持哪些编解码器 , 配置后会下载对应的源码 ;
- 先编译 依赖库的源码 , 然后将编译结果组合到 FFmpeg 源码中一起进行编译 ;
AVCodec 库 实现了多种视频、音频编解码器的支持 , 包括 常见的 H.264、H.265、VP8、MP3、AAC 等 , 涵盖 硬件加速编码器 和 解码器 , 如 : NVENC、VAAPI ;
FFmpeg 开发时 , 通过 AVCodecContext 结构体 配置 和 控制 要使用的编码器或解码器 ;
使用如下两个函数进行编码 ,
avcodec_send_frame();
avcodec_receive_packet();
使用如下两个函数进行解码 ,
avcodec_send_packet();
avcodec_receive_frame();
5、AVFilter 库
AVFilter 库 ( libavfilter ) 是 音视频滤镜库 , 该库 提供了一系列用于音视频过滤的功能
音视频滤镜 可以同时设置多个 , 称为 " 滤镜链 " , 滤镜链 在 FFmpeg 中 通过 AVFilterGraph 结构体来定义 ;
使用 多个滤镜 对音视频数据进行处理 , 可以 形成一个 滤镜图 ( Filter Graph ) ;
FFmpeg 使用滤镜时 , 需要 先设置 滤镜图 , 然后 通过 av_buffersrc_add_frame() 和 av_buffersink_get_frame() 处理 数据帧 ;
使用下面的函数 创建滤镜链 并 处理数据 :
avfilter_graph_create_filter();
av_buffersrc_add_frame();
6、SWScale 库
SWScale 库 ( libswscale ) 是 图像缩放 和 像素格式转换库
- 图像缩放
- 色彩空间转换
- 像素格式转换
H.264 压缩格式的视频 解码成 原始视频帧 后 , 需要 将 YUV 格式转为 RGB 格式 , 才能播放出来 ;
调用
sws_scale();
函数 , 可以将 YUV 视频格式转为 RGB 视频格式 ;
7、SwrRessample 库
SwrRessample 库 ( libswresample ) 用于 音频重采样 和 格式转换 , 可 修改音频采样的 采样率、声道布局、采样位数 ;
使用 libswresample 库中的
swr_convert();
函数 , 可以将 44.1kHz 的音频流重采样为 48kHz ;
8、PostProc 库
FFmpeg 中的 PostProc 库 ( libpostproc ) 是 视频后处理库 ( Post Processing ) , 用于 在视频解码之后对图像质量进行优化和改善 , 对 低质量视频流 后处理 , 可以提高 视频质量 ;
PostProc 库 常见的后处理操作 :
- 去块效应 Deblocking : 消除因视频块编码产生的块状效应 , 这在 MPEG 格式的视频中尤为明显 ;
- 去环效应 Deringing : 去除因压缩产生的边缘伪影和环形噪声 ;
- 锐化处理 : 对模糊的图像进行边缘增强 , 提高视觉清晰度 ;
PostProc 库 已过时 : PostProc 库 在 早期的 FFmpeg 使用中较为重要 , 但 随着编解码器和滤镜技术的进步 , 现在已很少被使用 ;
当前 视频处理 中 , 更多地 依赖于 AVFilter 滤镜库 来 提高 图像质量 ;
9、AVDevice 库
AVDevice 库 ( libavdevice ) 是一个专门用于 处理各种 输入 / 输出 设备的库 , 主要功能就是 从 实时设备 捕获 音频和视频 , 或 将 音视频 输出到设备 ;
AVDevice 库 常见功能 :
- 从 输入设备 捕获音视频 : 可以 从 硬件设备 捕获音视频数据 , 并作为输入流进行处理 , 如 : 摄像头、麦克风、屏幕等 ;
- 向 输出设备 播放音视频 : 将 处理后的 音视频数据 输出到 硬件设备 进行播放 , 如 : 显示器、扬声器 等 ;
执行
ffmpeg -f dshow -list_devices true -i ""
命令 , 获取当前 WIndows 平台的音视频设备 , 使用的就是 AVDevice 库 的功能 ;
这里注意 -f dshow
参数设置 :
- 在 MacOS 平台 , 使用 avfoundation
- 在 Windows 平台 , 使用 dshow
- 在 Linux 平台 , 使用 v4l2 捕获设备 ;
参考 【FFmpeg】音视频录制 ① ( 查询系统中 ffmpeg 可录制的音视频输入设备 | 使用 ffmpeg 命令录制音视频数据 | 录制视频数据命令 |录制音频数据| 同时录制音频和视频数据命令 ) 博客 ;