赞
踩
1、AVUtil: 核心工具库,许多其他模块都会依赖该库做一些基本的音视频处理操作,如log信息、版本信息等。
2、AVFormat: 文件格式和协议库,封装了Protocol层和Demuxer、Muxer层。其中实现了目前多媒体领域中的绝大多数媒体封装格式,包括封装和解封装,如MP4、FLV、KV、TS等文件封装格式,RTMP、RTSP、MMS、HLS等网络协议封装格式。FFmpeg是否支持某种媒体封装格式,取决于编译时是否包含了该格式的封装库。根据实际需求,可进行媒体封装格式的扩展,增加自己定制的封装格式,即在AVFormat中增加自己的封装处理模块。
3、AVCodec: 编解码库,封装了Codec库,AVCodec中实现了目前多媒体领域绝大多数常用的编解码格式,即支持编码,也支持解码。AVCodec除了支持MPEG4、AAC、MJPEG等自带的媒体编解码格式之外,还支持第三方的编解码器,如H.264(AVC)编码,需要使用x264编码器;H.265(HEVC)编码,需要使用x264编码器;MP3(mp3lame)编码,需要使用libmp3lame编码器。如果希望增加自己的编码格式,或者硬件编解码,则需要在AVCodec中增加相应的编解码模块。默认不会添加libx264、libfdk_aac等三方库的,但可以插件形式添加,然后提供统一接口。
4、AVFilter: 提供了一个通用的音频、视频、字幕等滤镜处理框架。在AVFilter中,滤镜框架可以有多个输入和多个输出,提供滤镜管道服务,例如视频的缩放、旋转、裁剪和拼接,音频重采样。
5、AVDevice: 音视频设备的录制和播放服务,例如列出可用设备,录制摄像头,播放视频等
6、SwrRessample: 该模块可用于音频重采样,可以对数字音频进行声道数、数据格式、采样率、等多种基本信息的转换,同时支持音频通道布局转换与布局调整。
7、SWScale: 提供了高级别的图像转换API,例如它允许进行图像缩放和像素格式转换,常见于将图像从1080p转换成720p或者480p等的缩放,或者将图像数据从YUV420p转换成YUYV,或者YUV转RGB等图像格式转换。
8、PostProc: 该模块可用于进行后期处理,当我们使用AVFilter的时 候需要打开该模块的开关,因为Filter中会使用到该模块的一些基础函数。
avformat_alloc_context:用于创建AVFormatContext对象
avformat_open_input:打开视频输入文件
avformat_find_stream_info():获取视频文件信息
avcodec_find_decoder():查找解码器
avcodec_open2():打开编解码器
av_read_frame():从输入文件读取一帧压缩数据
avcodec_decode_video2():解码一帧视频数据
avcodec_decode_audio4():解码一帧音频数据
avcodec_close():关闭解码器
avcodec_send_packet():发送待解码的数据包
avcodec_receive_frame():接收解码后的帧
封装格式上下文结构体,也是统领全局的结构体,保存了视频文件封装格式相关信息。
每种封装格式(例如FLV, MKV, MP4, AVI)对应一个该结构体。
视频文件中每个视频(音频)流对应一个该结构体。
编解码器上下文结构体,保存了视频(音频)编解码相关信息。
每种视频(音频)编解码器(例如H.264解码器)对应一个该结构体。
存储一帧或多帧(音频)压缩编码数据。
存储一帧解码后像素(采样)数据。
AVFormatContext API调用
AVInputFormat 主要是FFMPEG内部调用
数据:
AVFormatContext 封装格式上下文结构体
struct AVInputFormat *iformat;
方法:
AVInputFormat 每种封装格式(例如FLV, MKV, MP4)
int (*read_header)(struct AVFormatContext * );
int (*read_packet)(struct AVFormatContext *, AVPacket *pkt);
数据:
AVCodecContext 编码器上下文结构体
struct AVCodec *codec;
方法:
AVCodec 每种视频(音频)编解码器
int (*decode)(AVCodecContext *, void *outdata, int *outdata_size, AVPacket *avpkt);
int (*encode2)(AVCodecContext *avctx, AVPacket *avpkt, const AVFrame *frame, int *got_packet_ptr);
1、avformat_alloc_context(): 负责申请一个AVFormatContext结构的内存,并进行简单初始化。
2、avformat_free_context(): 释放该结构里的所有东西以及该结构本身。
3、avformat_close_input(): 关闭解复用器。关闭后就不再需要使用avformat_free_context 进行释放。
4、avformat_open_input(): 打开输入视频文件。
5、avformat_find_stream_info(): 获取音视频文件信息。
6、av_read_frame(): 读取音视频包。
7、avformat_seek_file(): 定位文件。
8、av_seek_frame(): 定位文件。
ffmpeg 的 Mux 主要分为三步操作:
1、avformat_write_header: 写文件头
2、av_write_frame/av_interleaved_write_frame: 写packet
3、av_write_trailer: 写⽂件尾
1、avcodec_find_encoder: 根据指定的AVCodecID查找注册的编码器。
2、avcodec_alloc_context3: 为AVCodecContext分配内存。
3、avcodec_open2: 打开编码器。
4、avcodec_send_frame: 将AVFrame⾮压缩数据给编码器。
5、avcodec_receive_packet: 获取到编码后的AVPacket数据,收到的packet需要⾃⼰释放内存。
6、av_frame_get_buffer: 为⾳频或视频帧分配新的buffer。在调⽤这个函数之前,必须在AVFame上设置好以下属性:format(视频为像素格式,⾳频为样本格式)、nb_samples(样本个数,针对⾳频)、channel_layout(通道类型,针对⾳频)、width/height(宽⾼,针对视频)。
7、av_frame_make_writable: 确保AVFrame是可写的,使av_frame_make_writable()的问题是,在最坏的情况下,它会在您使⽤encode再次更改整个输⼊frame之前复制它. 如果frame不可写,av_frame_make_writable()将分配新的缓冲区,并复制这个输⼊input frame数据,避免和编码器需要缓存该帧时造成冲突。
8、av_samples_fill_arrays: 填充⾳频帧。
1、avcodec_alloc_context3(): 分配解码器上下文 avcodec_find_decoder():根据ID查找解码器。
2、avcodec_find_decoder_by_name(): 根据解码器名字 avcodec_open2(): 打开编解码器。
3、avcodec_decode_video2(): 解码一帧视频数据。
4、avcodec_decode_audio4(): 解码一帧音频数据。
5、avcodec_send_packet(): 发送编码数据包 avcodec_receive_frame(): 接收解码后数据。
6、avcodec_free_context(): 释放解码器上下文,包含了 avcodec_close()。
7、avcodec_close(): 关闭解码器。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。