04 FFmpeg源码组成

封装的目的:

  • 1. 是为了在一个文件流(Stream)中能同时存储视频流(Video Stream)、音频流(Audio Stream)、字幕(Subtitle)、附件(t)、数据(d)等内容。这正是“复用”的含义所在(分时复用)。
  • 2. 是在网络环境下确保数据的可靠快速传输。

编码的目的:

是为了压缩媒体数据。有别于通用文件数据的压缩,在图像或音频压缩的时候,可以借助图像特性(如前后关联、相邻图块关联)或声音特性(听觉模型)进行压缩,可以达到比通用压缩技术更高的压缩比。

一、FFmpeg 的基本组成

FFmpeg 的基本组成包含avformat、Codec、Filter、Devices、Utils等:

1、封装模块avformat

 libavformat中实现了目前多媒体领域中的几乎所有的封装格式的封装及解封装,它直接决定了ffmpeg能否支持某种封装格式的视频的封装或解封装。

例如:mp4、flv、mkv等容器的封装与解封装;又或者是RTMP、RTSP、TCP、UDP等协议的封装与解封装。

关于封装与解封装的操作,对CPU的消耗不会特别严重,因为封装与解封装不涉及到复杂的计算,更多的是I/O,如果希望增加自己定制的封装格式的话,需要在libavformat中增加自己的对应的format模块。

2、编解码模块avcodec

libavcodec中实现了目前多媒体领域几乎所有的编解码格式,可以编码,也可以解码,不过有些编码需要使用第三方的编码器的支持。

例如:H.264(AVC)编码需要借助x264编码器;H.265(HEVC)编码需要借助x265编码器;mp3(mp3lame)编码需要使用libmp3lame编码器。

ffmpeg本身其实已经支持多种编码格式,例如mpeg4、aac、mjpeg等编码,如果希望增加自己的编码格式,或者硬件编解码,需要在libavcodec中增加自己的codec模块

3、滤镜模块avfilter

libavfilter 库提供了一个通用的 音频 / 视频滤镜框架,处理一些滤镜相关的操作。

在 libavfilter中,滤镜框架可以有多个输入和多个输出。为了说明的各种存在的场景,我们参考一下下面这个filtergraph例子:

 从上图可以看出,左边输入的视频被切割成为两部分码流,一部分抛给crop与vclip进行操作,另一部分保持原样,当crop与vflip操作完成后,两股流将在overplay处进行合并,输出处理后的新的视频,对应的命令行如下:

ffmpeg -i INPUT -vf "split [main][tmp]; [tmp] crop=iw:ih/2:0:0, vflip [flip]; [main][flip] overlay=0:H/2" OUTPUT

下面看一下具体的执行情况,用来验证该命令的可行性:


运行后生成的视频结果将是视频的上半部分镜像到底部一半的输出视频,下面详细说明一下规则:

  1. 相同的Filter线性链由逗号分隔
  2. 不同的Filter线性链之间用分号分隔

在示例中,crop与vflip使用的是同一个Filter线性链,split和overlay使用的是另外一个线性链,线性链接入到另一个线性链汇合处时是通过方括号’[]’括起来的标签进行标示的。在这个例子中,两个流处理后是通过[main]与[tmp]进行关联汇合的。
split filter将分割后的视频流的第二部分分配给滤镜,打上标签[tmp],将该部分流通过crop filter进行处理,然后进行纵坐标调换操作,打上标签[flip],然后将main与flip进行合并,flip标签的视频流显示的时候从视频的左边最中间的位置开始显示,就出现了镜像效果。
可以对比一下运行的前后效果:

 4、视频图像转换计算模块swscale

FFmpeg 的libswscale 模块提供了高级别的图像转换API接口。特别是,它允许一个进行图像缩放和像素格式转换。常见于将图像从1080p转换成720p或者480p等缩放,或者将图像数据从yuv420p转换成yuyv,或者yuv转rgb等图像格式转换。

5、音频转换计算模块resample

FFmpeg 的libresample 模块提供了高级别的音频重采样API接口。特别是,它允许一个执行音频采样、 音频通道布局 rematrixing 和转换的音频格式和包装布局。

6、设备管理模块avdevice    

libavdevice提供了访问捕获设备和回放设备的接口。

二、FFmpeg核心结构体

  • AVFormatContext:解封装功能的结构体,包含文件名、音视频流、时长、比特率等信息;
  • AVCodecContext:编解码器上下文,编码和解码时必须用到的结构体,包含编解码器类型、视频宽高、音频通道数和采样率等信息;
  • AVCodec:存储编解码器信息的结构体;
  • AVStream:存储音频或视频流信息的结构体;
  • AVPacket:存储音频或视频编码数据;
  • AVFrame:存储音频或视频解码数据(原始数据)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Chiang木

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值