导图社区 ffmpeg组件分析
开源项目ffmpeg的组件分析,以上是FFmpeg的主要组件及其功能的简要分析。这些组件共同构成了FFmpeg强大的音视频处理能力,使得FFmpeg成为音视频处理领域的重要工具之一。
编辑于2024-04-27 22:32:03华为鸿蒙系统详解。Harmony OS NEXT是基于LonOS去除Android(AOSP)后形成的全新手机操作系统。该系统集成了Linux内核和LiteOS作为其底层内核系统。在编译和构建方面,它使用定制版本的Clang编译器作为前端,LLVM作为后端,针对目标架构arm-linux-ohos进行优化。为了支持嵌入式环境,系统采用了uclibc作为小型的C语言标准库,并且也支持musl-libc,这是一个轻量级且高效的C标准库实现,常用于嵌入式系统和一些主流的Linux发行版,如AlpineLinux和Gentoo。
C++ 性能优化的方法,详细概述了C++程序中优化性能的各种策略、技术、工具和方法。并行化技术:使用TBB(Threading Building Blocks)或OpenMP指令来实现多线程计算。TBB主要针对C++,而OpenMP则支持多种语言。使用硬件特性:利用SIMD(单指令多数据)指令集,如SSE或AVX,进行向量化操作,以加速数据处理。确保编译器和硬件平台支持向量化操作。
Valgrind 工具集分析,这个工具集对于开发人员来说是非常有用的,因为它可以帮助发现程序中的内存问题、性能瓶颈等。
社区模板帮助中心,点此进入>>
华为鸿蒙系统详解。Harmony OS NEXT是基于LonOS去除Android(AOSP)后形成的全新手机操作系统。该系统集成了Linux内核和LiteOS作为其底层内核系统。在编译和构建方面,它使用定制版本的Clang编译器作为前端,LLVM作为后端,针对目标架构arm-linux-ohos进行优化。为了支持嵌入式环境,系统采用了uclibc作为小型的C语言标准库,并且也支持musl-libc,这是一个轻量级且高效的C标准库实现,常用于嵌入式系统和一些主流的Linux发行版,如AlpineLinux和Gentoo。
C++ 性能优化的方法,详细概述了C++程序中优化性能的各种策略、技术、工具和方法。并行化技术:使用TBB(Threading Building Blocks)或OpenMP指令来实现多线程计算。TBB主要针对C++,而OpenMP则支持多种语言。使用硬件特性:利用SIMD(单指令多数据)指令集,如SSE或AVX,进行向量化操作,以加速数据处理。确保编译器和硬件平台支持向量化操作。
Valgrind 工具集分析,这个工具集对于开发人员来说是非常有用的,因为它可以帮助发现程序中的内存问题、性能瓶颈等。
ffmpeg
libavutil
Crypto and Hashing
加密:AES、Base64、blowfish
哈希:CRC、MD5、SHA、SHA-512等
Mathematics
提供数据概念相关的功能
String Manipulation
Memory Management
Data Structures
AVBuffer
AVBuffer是一系列支持引用计数的数据缓冲的API集合。
AVBufferPool
AVBufferPool是一个由AVBuffer构成的、没有线程锁的、线程安全的缓冲池。
AVFrame
AVFrame是对原始多媒体数据的一个基于引用计数的抽象,比较常用的是音频帧和视频帧。
AVOptions
AVOptions提供了通用的option设置和获取机制,可适用于任意struct(通常要求该结构体的第一个成员必须是AVClass指针,该AVClass.options必须指向一个AVOptions的静态数组,以NULL作为结束)。
AVDictionary
一个简单的键值对的字典集。
AVTree
低复杂度的树容器。插入、删除、查找等常用操作都是O(log n)复杂度的实现版本。
Video related
Audio related
Error Codes
错误码与错误处理
支持通过错误码查询错误描述
Logging Facility
提供日志输出的相关接口和宏,通过这些接口外部可以完全控制ffmpeg所有的日志输出。
libavformat
完成针对多媒体文件或流媒体(FFmpeg内部成为URL)的数据解析,包括数据读取、格式分析以及包读取;多媒体文件生成。
主要结构体
AVFormatContext
AVStream
AVInputFormat
主要函数
audio_encode
获取解码器
通过id获取
AVCodec *avcodec_find_decoder(enum AVCodecID id);
通过名称获取
AVCodec *avcodec_find_decoder_by_name(const char name);
获取解码器在使用之前必须保证所用到的解码器已经注册,最简单的就是调用avcodec_register_all() 函数
AVCodecContext 解码器上下文
avcodec_alloc_context3(const AVCodec *codec); //申请AVCodecContext空间。需要传递一个编码器,也可以不传,但不会包含编码器。
void avcodec_free_context(AVCodecContext **avctx); // 清理AVCodecContext空间。
int avcodec_open2(AVCodecContext *avctx, const AVCodec *codec, AVDictionary **options);//打开视频解码器。如果在 avcode_alloc_context3 的时候没有传解码器,则在此需要进行传递,后面的options是可选参数。参见:libavcodec/options_table.h。
主要结构体
解协议(http,rtsp,rtmp,mms)
AVIOContext
URLProtocol
存储输入视音频使用的封装格式
URLContext
存储视音频使用的协议的类型以及状态
解封装(flv,avi,rmvb,mp4)
AVFormatContext
存储视音频封装格式中包含的信息
AVInputFormat
存储输入视音频使用的封装格式,每种视音频封装格式都对应一个AVInputFormat 结构
解码(h264,mpeg2,aac,mp3)
AVStream
存储每一个视频/音频流信息的结构体
主要变量
index:标识该视频/音频流
AVCodecContext *codec:指向该视频/音频流的AVCodecContext(它们是一一对应的关系)
AVRational time_base:时基。通过该值可以把PTS,DTS转化为真正的时间。
int64_t duration:该视频/音频流长度
AVDictionary *metadata:元数据信息
AVRational avg_frame_rate:帧率(注:对视频来说,这个挺重要的)
AVPacket attached_pic:附带的图片。比如说一些MP3,AAC音频文件附带的专辑封面。
存储一个视频/音频流的相关数据
AVCodec结构体
存储编码器信息的结构体
主要变量信息
const char *name:编解码器的名字,比较短
const char *long_name:编解码器的名字,全称,比较长
enum AVMediaType type:指明了类型,是视频,音频,还是字幕
enum AVCodecID id:ID,不重复
const AVRational *supported_framerates:支持的帧率(仅视频)
const enum AVPixelFormat *pix_fmts:支持的像素格式(仅视频)
const int *supported_samplerates:支持的采样率(仅音频)
const enum AVSampleFormat *sample_fmts:支持的采样格式(仅音频)
const uint64_t *channel_layouts:支持的声道数(仅音频)
int priv_data_size:私有数据的大小
每一个编解码器对应一个结构体
AVCodecContext
主要变量信息
enum AVMediaType codec_type:编解码器的类型(视频,音频...)
struct AVCodec *codec:采用的解码器AVCodec(H.264,MPEG2...)
int bit_rate:平均比特率
uint8_t *extradata; int extradata_size:针对特定编码器包含的附加信息(例如对于H.264解码器来说,存储SPS,PPS等)
AVRational time_base:根据该参数,可以把PTS转化为实际的时间(单位为秒s)
int width, height:如果是视频的话,代表宽和高
int refs:运动估计参考帧的个数(H.264的话会有多帧,MPEG2这类的一般就没有了)
int sample_rate:采样率(音频)
int channels:声道数(音频)
enum AVSampleFormat sample_fmt:采样格式
int profile:型(H.264里面就有,其他编码标准应该也有)
AVPacket
存储压缩编码数据相关信息的结构体
主要变量信息
uint8_t *data:压缩编码的数据。
int size:data的大小
int64_t pts:显示时间戳
int64_t dts:解码时间戳
int stream_index:标识该AVPacket所属的视频/音频流。