FFmpeg学习:03.FFmpeg组成

694 阅读3分钟

第一章的时候我们下载并编译了FFmpeg库。但好像都没介绍FFmpeg到底是干嘛的。

介绍

FFmpeg是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源计算机程序。

组成

.exe文件(命令行文件):

  • ffmpeg:用于对视频文档或音频档案转换格式。
  • ffplay:一个简单的播放器,基于FFmpeg库(解码)与SDL(显示)。
  • ffprobe:用于显示媒体文件的信息。

函数库:

  • libavcodec:包含全部的音频/视频编解码库
  • libavdevice:用于硬件的音视频采集、加速和显示
  • libavfilter:提供了一个通用的音视频filter框架。使用avfilter可以对音视频数据做一些效果处理如去色调、模糊、水平翻转、裁剪、加方框、叠加文字等功能
  • libavformat:包含多媒体容器格式的封装器和解封装器。如MP4、FLV、TS等文件封装格式,RTMP、RTSP、HLS等网络协议封装格式。
  • libavresample:一个音频重采样,样本格式转换和混合的库
  • libavutil工具函数的库,包括随机数生成器、数据结构、数学工具、核心多媒体工具等功能。
  • libpostproc:对于视频做后期效果处理的库
  • libswresample:提供音频重采样,采样格式转换和混合等功能
  • libswscale:高度优化的图像比例缩放、图像颜色空间/像素格式转换,如rgb与yuv之间转换。

libavcodec、libavformat、libavutil是较为主要也常用的库,提供了音视频开发的最基本功能,应用范围也是最广的。

注:写这篇文章的时候查了很多文章,发现并没有人写到libavresample和libswresample这俩库的区别。查了官方解释,发现这俩的描述也是一摸一样。所以暂时不去深究这俩的区别,之后用到了再深入研究。

常用类

介绍前再回顾下音视频处理流程:

根据功能可以分为以下几块:

  1. 解协议(http,rtsp,rtmp,mms)

    • AVIOContext:管理输入输出数据的结构体;
    • URLProtocol:描述了音视频数据传输所使用的协议,每种传输协议都对应一个URLProtocol结构体;
    • URLContext:主要存储音视频使用的协议的类型以及状态。
  2. 解封装(flv,avi,rmvb,mp4)

    • AVFormatContext:主要存储音视频封装格式中包含的信息;统领全局的结构体,贯穿始终。
    • AVInputFormat:存储输入音视频使用的封装格式。每种音视频封装格式都对应一个AVInputFormat结构。
    • AVOutputFormat:存储输出音视频使用的封装格式。每种音视频封装格式都对应一个AVOutputFormat结构。
  3. 解码(h264,mpeg2,aac,mp3)

    • AVStream:每个存储一个视频/音频流的相关数据
    • AVCodecContext:存储该视频/音频流使用解码方式的相关数据;
    • AVCodec:包含该视频/音频对应的解码器,每种解码器都对应一个AVCodec结构;

    每个AVStream对应一个AVCodecContext,每个AVCodecContext中对应一个AVCodec。就是AVStream结构体里有一个成员就是AVCodecContext。

  4. 存数据

    • AVPacket:编码后、解码前的压缩数据,即H264码流数据或AAC;
    • AVFrame:编码前、解码后的原始数据,如YUV格式的视频数据或PCM格式的音频数据等;

    视频的话,每个结构一般是存一帧;音频可能有好几帧

对应关系如下:

官方技术文档:ffmpeg.org/doxygen/tru…
雷神博客:blog.csdn.net/leixiaohua1…
其他博客:
www.cnblogs.com/renhui/p/69…
www.cnblogs.com/linuxAndMcu…