1、采样频率

采样为从连续信号转化为离散信号的一个过程,视频采样频率是指每秒采样的次数,用赫兹(Hz)来表示。采样频率的倒数是采样周期或者叫做采样间隔。视频采样频率一般为90KHz(90000Hz)。

2、ffmpeg的分层结构

ffmpeg从下到上对数据处理的分层结构为:原始数据层(Raw data)、编解码层(encode/decode)和封装层(mux/demux)。原始数据层的数据格式包括yuv、pcm等。编解码层数据格式包括h264、aac等。封装层的数据格式包括flv、mp4、mp3等。封装层对应ffmpeg中的AVStream。编解码层对应ffmpeg中的AVCodec。原始数据层也通过AVStream进行处理。

3、time_base

time_base相当于时间单位(时间基),和我们常见的时、分、秒、毫秒和微秒等时间单位类似,提供了ffmpeg中时间单位和秒的转换关系。例如,time_base为90000时,表示1秒等于90000个时间单位。ffmpeg中不同层对时间单位的需求不一样,有的根据采样频率来定义time_base,有的根据帧率来定义time_base。因为时间是不变的,变化的只是度量的单位,通过携带time_base可以在不同时间度量单位间对时间进行转换。

4、ffmpeg中时间相关结构体和方法

(1)AV_TIME_BASE

在ffmpeg中定义为:

#define AV_TIME_BASE 1000000

表示ffmpeg中以微秒为处理时间的单位。

(2)AV_TIME_BASE_Q

ffmpeg内部时间基的分数表示,实际上它是AV_TIME_BASE的倒数。从它的定义能很清楚的看到这点:

#define AV_TIME_BASE_Q (AVRational){1,AV_TIME_BASE}

(3)AVRational

typedef struct AVRational{

int num;  //numerator

int den;  //denominator

}AVRational;

(4)av_q2d

static inline double av_q2d(AVRational a){

return a.num / (double)a.den;

}

(5)timestamp

时间戳,可以根据pts来计算视频的显示时间戳

timestamp = pts*av_q2d(st->time_base),timestamp计算结果单位为秒,st为一个AVStream对象指针

pts和dts在ffmpeg中单位为time_base,h264标准下换算为秒的话为1s/90KHZ。有的设备在输出视频时pts和dts的单位为毫秒,在利用ffmpeg解码时需要转换pts和dts的单位,Pts(ffmpeg)=Pts(设备)*90。

(6)duration

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

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

(7)int64_t av_rescale_q(int64_t a, AVRational bq, AVRational cq)

该函数提供了不同时间基间的转换功能,并且可以防止转换过程中溢出等情况的发生。该函数内部计算表示为a * bq / cq,把时间从bq时间基转换到cq时间基。