FFmpeg教学视频-初识FFmpeg

是什么

跨平台开源库,支持Windows,Android,ios等。

功能

处理音视频,具体包括:音视频源接入、输出、处理

开发语言

C语言

主要模块:

AVCodec

AVFormat

AVFilter

AVDevice

SwrResample

Swrscale

https://zhuanlan.zhihu.com/p/345409716

  1. libavformat: 媒体文件容器格式处理库。上面的 MediaDemuxer和MediaMuxer模块需要用到这个库进行码流文件解析和混流。
  2. libavcodec: 编解码器库。所有的音视频编码和解码操作需要使用这个库。
  3. libswresample: 音频格式转换和重采样处理的库。上面的音频前处理、后处理就需要用到这个库。
  4. libswscale: 视频格式转换和缩放处理的库。上面的视频前处理、后处理就需要用到这个库。
  5. libavfilter: 音视频滤镜、特效处理的库,例如:视频增加滤镜、音频添加音效等可以使用这个库里的函数。
  6. libavdevice: 设备操作库。上面提到的要在 控件界面显示、音频输出设备摄像头控制、麦克风 等控制可以使用这个库。 在大部分的操作系统中,这个是跟平台相关的,所以在很短实际项目中,比较少使用这个库,而是根据项目情况直接调用操作系统API进行处理。
  7. libavutil: Utility辅助函数库,提供一些独立的辅助函数功能。

在这几个库中,前四个库比较重要,是大部分的音视频项目中都会使用到的,而且对于滤镜、特效操作,大部分项目都会根据自己需求专门开发这方面的算法,所以较少直接使用FFMPEG的这个库,设备相关操作也是大部分直接调用操作系统平台API。

时间基数

https://blog.csdn.net/fanyun_01/article/details/89608876

DTS和PTS的解释

FFmpeg里有两种时间戳:DTS(Decoding Time Stamp)和PTS(Presentation Time Stamp)。

PTS:Presentation-Time-Stamp。PTS主要用于度量解码后的视频帧什么时候被显示出来。

DTS:Decode-Time-Stamp。DTS主要是标识读入内存中的比特流在什么时候开始送入解码器中进行解码。

前者是解码的时间,后者是显示的时间。

在大多数编解码标准(如H.264或HEVC,当出现B帧的时候)中,编码顺序和输入顺序并不一致。于是才会需要PTS和DTS这两种不同的时间戳。

PTS:视频帧显示时间。

DTS:视频帧解码时间。

timestamp = pts*av_q2d(st->time_base)

结合下面可知:时间戳 = pts * (AVRational.num/AVRational.den)

1
2
3
4
5
6
7
8
static inline double av_q2d(AVRational a){
return a.num / (double)a.den;
}

typedef struct AVRational{
int num; ///<分子
int den; ///< 分母
} AVRational;

其实当num=1,den=1000的时候pts的时间单位就相当于毫秒 1/1000秒
其实当num=1,den=1000000的时候pts的时间单位就相当于微秒 1/1000000秒。

实际中比较多的是1/90000。

假如视频是25帧,那么在timebase=1/1000时,第一、第二帧的时间戳分别为0、40;timebase=1/90000时,第一、第二帧的时间戳分别为0、3600。

也就是说,第n帧=1000/帧数*n*缩放倍数(上面倍数=90000/1000=90)

duration:视频时间长度,ffmpeg中duration表示的时间长度是以对应的time_base为单位的,换算成秒的方法为

duration(秒) = st->duration * av_q2d(st->time_base),st为一个AVStream对象指针