赘述一下音频的几个最基本因素:
- 声道
可以理解为每个音频含有几个可以相互独立的音频。
如果你乐意,可以用双声道,可以存两首歌,左耳右耳听不一样的歌曲,体验双耳互博。 - 采样率
每秒采样的次数。比如44100Hz就是每秒采集44100次音频的数据。
如果你乐意,可以用2Hz,分别在一秒的第0ms和500ms采集两次,特别省存储。 - 位宽
每次采样的数据用多大的空间来存储。比如16bit,就是使用16个位来存储一次采样的数据,那就是可以有2^16的变化。
如果你乐意,可以用1bit,对音箱设备来讲只有响或者不响两个选择。
FFMpeg的一些参数
在使用ffmpeg解码音频的时候会有一些参数让我们感到困惑,分别来做个记录
- AVFrame->nb_samples / AVCodecParameters->frame_size:
每帧含有多少个采样数。FFMpeg解码的时候是一帧一帧读取的,
nb_samples代表了这一帧里面含有多少个采样数。 - sample_rate
上面说过的采样率
sample_rate = 44100Hz的采样率下如果nb_samples = 1152,那么该音频每秒有44100 / 1152 = 38.28125个Frame,所以可以根据这个来判断出当前frame的真实时间。
当然这只是获取当前帧时间的一种方式,还有其他的方式来确定frame的当前时间。
- time_base
类似于上面的用采样率当做时间刻度,ffmpeg用来做同步的时间单位叫做time_base时间基。
如我们认为原子是物质的最小单位一样,那比较两个物体的大小可以用含有多少个原子来表示,含有2个原子就比1个原子来的大。又比如我们确定一块屏幕的分辨率大小是有多少个像素。那么在这些例子里,原子跟像素就相当于他们标准里的time_base。
我们把一秒分成1000份,那么time_base就是一毫秒,那评判时间长短就是含有多少个1ms,我们只需要知道每一帧应该在第X毫秒出现就可以确定这一帧应该播放的时间了,这个X就是下面的pts。 - pts
如上面所说,pts表明在第多少个时间基当前帧应该播放出来。
所以确定当前帧的时间应该是pts * time_base,ffmpeg中获取time_base应该使用av_q2d(time_base),所以是pts * av_q2d(time_base),下面的一张图用来做参考:
展示了在一秒的时间里,采样率,位宽,nb_samples,time_base,pts分别在其中的作用。