ffmpeg整体框架
一,FFmpeg介绍
FFmpeg是一款音视频编解码工具,同时也是一组音视频编码开发套件,作为编码开发套件,它为开发者提供了丰富的音视频处理的调用接口。
如果我们研究学习音视频,FFmpeg是最好的切入项目,它基本上包含了音视频大部分知识。
二、FFmpeg整体结构
我们编译FFmpeg会得3个可执行文件,分别是ffplay,ffmpeg,ffprob。 ffplay主要用于播放音视频数据。ffmpeg:用于处理音视频数据。ffprob:用于分析音视频数据。而这3个可执行文件,主要是有7个部分功能组成。
AVFormat:文件格式和协议库,主要是对Protocol层、Demuxer、Muxer层进行了封装,我们可以使用它解析flv,MP4,hls等格式音视频数据。
AVCodec:编解码库,封装了Codec层相关功能,FFmpeg默认是不会添加像libx264、FDK-AAC等库的,正常的Codec都是有自己的License的,我们可以像加入插件一样,把这些code加入到ffmpeg,开发者只需要调用FFmpeg提供固定统一的接口。
AVFilter:音视频滤镜库,主要是提供音频和视频特效处理接口。
AVDevice:输入输出设备库,主要是与麦克风,摄像头,屏幕,喇叭硬件的数据采集或者输出数据。ffplay的播放音视频功能,就用到该模块,同时也需要SDL的预先编译,因为该设备模块播放声音与播放视频使用的都是SDL库。
SwrRessample:主要功能是对音频数据进行处理,可对音频数据进行修改,比如双声道单声道互相转换、pcm数据格式转换、不同采样率转换。
SWScale:主要功能是对视频数据进行处理,可以RGB与YUV互相转换,可以自由修改视频分辨率,获得标清,超清视频。
PostProc:音视频后期处理用到,AVFilter功能实现会依赖该模块相关接口。
二、FFmpeg播放器
ffmpeg最基本功能就是播放视频,下面是ffmpeg处理音视频大致流程。
第一步,FFmpeg会调用AVFormat相关函数,去读取音视频文件或者流地址。
第二步,FFmpeg调用解复用器,将相关的音视频流解析出一个一个packtc包,比如音视频流可能是flv或者MP4,通过解析获取H264,aac的分packet包。
第三步,调用AVcode模块,将包解析成frame,H264变成yuv420,aac变成pcm。
第四步,将获取到yuv,pcm数据进行处理,如变声,美颜之类。也可以直接输出到屏幕,喇叭。