文章目录

  • 一、FFmpeg 库结构
  • 1、FFmpeg 库的结构总体概览
  • 2、AVUtil 库
  • 3、AVFormat 库
  • 4、AVCodec 库
  • 5、AVFilter 库
  • 6、SWScale 库
  • 7、SwrRessample 库
  • 8、PostProc 库
  • 9、AVDevice 库







一、FFmpeg 库结构




1、FFmpeg 库的结构总体概览



FFmpeg 库的结构如下 :

【FFmpeg】FFmpeg 播放器框架 ④ ( FFmpeg 库结构 | AVUtil 库 | AVFormat 库 | AVCodec 库 | AVFilter 库 | SWScale 库 )_AVUtil

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 命令录制音视频数据 | 录制视频数据命令 |录制音频数据| 同时录制音频和视频数据命令 ) 博客 ;