多媒体处理工具-Libav
2014-11-27 13:29:43 阿炯

Libav是一个完整的、跨平台的用于音频和视频录制、转换的解决方案,包含libavcodec编码器。其前身是ffmpeg。它是一个自由软件,采用C语言开发并在GPL或LGPL协议下授权。可以执行影音多种格式的录影、转档、串流等功能,包含了libavcodec(一个用于多个影音文件中音讯和视讯的解码器函数库),以及libavformat(一个影音格式转换函数库)。


Libav is a collection of libraries and tools to process multimedia content such as audio, video, subtitles and related metadata.Open source audio and video processing tools.


Libav是某些原ffmpeg开发者企图夺取ffmpeg控制权失败后的用于替代其新工具集,主流发行版如Debian和Ubuntu已转向使用它了(当然后期又转回了ffmpeg)。


2011年1月19日,FFmpeg 的现任维护者 Michael Niedermayer 在邮件列表上披露,FFmpeg 发生了“变动”,一些开发者占领了官方网站,关闭了其他人的写入权限。随后政变者宣布 FFmpeg “建立新团队”,维护任务将由他们接手,宣称只有维护团队才能拥有主源码库的写入权限。

“新内阁”成员之一的 Diego Biurrun 解释了他们的行动,称“改变”是迫不得已,表示他们原本想联络每一个开发者,但没成功,因为不是每个人都在IRC上,或者能及时回电话、邮件或短信。“革命”的原因是为了统一,FFmpeg 社区分裂的情况严重到他们已经看不下去了。他们期望FFmpeg项目能建立一个健康而友好的开发环境。FFmpeg项目最初是由Fabrice Bellard发起的,而现在是由Michael Niedermayer在进行维护。许多FFmpeg的开发者同时也是MPlayer项目的成员,FFmpeg在MPlayer项目中是被设计为服务器版本进行开发。


架构及流程分析

1、整体架构


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中会使用到该模块的一些基础函数。

2、音视频播放流程


3、组件注册流程


4、解复用流程


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():定位文件。

5、解封装流程


ffmpeg 的 Mux 主要分为 三步操作:

1.avformat_write_header:写文件头

2.av_write_frame/av_interleaved_write_frame:写packet

3.av_write_trailer:写⽂件尾

3.6、编码流程


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:填充⾳频帧。

7、解码流程


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():关闭解码器。

重点数据结构速看

封装格式上下文结构体,也是统领全局的结构体,保存了视频文件封装格式相关信息。每种封装格式(例如FLV, MKV, MP4, AVI)对应一个该结构体。视频文件中每个视频(音频)流对应一个该结构体。

AVCodecContext编解码器上下文结构体,保存了视频(音频)编解码相关信息。每种视频(音频)编解码器(例如H.264解码器)对应一个该结构体。

AVFormatContext、AVStream和AVCodecContext之间的关系


AVPacket和AVFrame之间的关系



Libraries

 libavcodec provides implementation of a wider range of codecs.
 libavformat implements streaming protocols, container formats and basic I/O access.
 libavutil includes hashers, decompressors and miscellaneous utility functions.
 libavfilter provides a mean to alter decoded Audio and Video through chain of filters.
 libavdevice provides an abstraction to access capture and playback devices.
 libavresample implements audio mixing and resampling routines.
 libswscale implements color conversion and scaling routines.

Tools

 avconv is a command line toolbox to manipulate, convert and stream multimedia content.
 avplay is a minimalistic multimedia player.
 avprobe is a simple analisys tool to inspect multimedia content.
 Additional small tools such as aviocat, ismindex and qt-faststart.


FFmpeg 项目的维护开发组在2011年3月中旬决定 ffmpeg 项目将改名为Libav,网址:http://libav.org ,同时制定了一套关于项目继续发展和维护的规则。在经历了一段时间的开发后趋于沉寂,截止到2023年12月,从GitHub上看,其最新的更新维持在2018年的12月。

Debian 决定从 Libav 切换到 FFmpeg

2015年8月上旬消息,在将近一年的讨论之后,Linux发行版Debian正式决定从Libav切换到FFmpeg,最主要的理由是:FFmpeg在几乎所有方面都比Libav好。Libav是FFmpeg的分支,是一群“心怀不满”的 FFmpeg开发者“起义”创建的,一度比FFmpeg更有活力,但如今的情况颠倒了过来。以修复bug为例,FFmpeg在3年前修正的一个bug,Libav到2015年6月仍然没有修复(不过现在终于修复了)。



最新版本:10.5


官方主页:http://libav.org/

项目主页:https://github.com/libav/libav