音视频时间戳获取及音视频同步原理

      时间戳是音视频都具有的属性,我们的音视频都是通过时间戳来同步的,首先,先看看音视频的时间戳计算方法。

1. 视频时间戳
      这个值主要是依赖于帧率;1000/fps为帧间间隔;相当于一个个间隔时间加上去了。可见这个计算是以帧为单位来计算的。pts = inc++ *(1000/fps);  其中inc是一个静态的,初始值为0,每次打完时间戳inc加1.

    在ffmpeg,中的代码为

    pkt.pts= m_nVideoTimeStamp++ * (m_VCtx->time_base.num * 1000 / m_VCtx->time_base.den);

2. 音频时间戳

      依赖于音频的sample rate来计算,(1000 / sample_rate)是每个采样多长时间,(frame_size * 1000 / sample_rate)计算出来framesize长度一个音频帧的时间长。这个值计算是以音频帧单位来计算的。 

       pts = inc++ * (frame_size * 1000 / sample_rate)

       在ffmpeg中的代码为

       pkt.pts= m_nAudioTimeStamp++ * (m_ACtx->frame_size * 1000 / m_ACtx->sample_rate);

       采样频率是指将模拟声音波形进行数字化时,每秒钟抽取声波幅度样本的次数。正常人听觉的频率范围大约在20Hz~20kHz之间,根据奈奎斯特采样理论,为了保证声音不失真,采样频率应该在40kHz左右。常用的音频采样频率有8kHz、11.025kHz、22.05kHz、16kHz、37.8kHz、44.1kHz、48kHz等,如果采用更高的采样频率,还可以达到DVD的音质对采样率为44.1kHz的AAC音频进行解码时,一帧的解码时间须控制在23.22毫秒内。(一个AAC原始帧包含一段时间内1024个采样及相关数据)。

分析:

1、 AAC

音频帧的播放时间=一个AAC帧对应的采样样本的个数/采样频率(单位为s)

        一帧 1024个 sample。采样率 Samplerate 44100KHz,每秒44100个sample, 所以 根据公式   音频帧的播放时间=一个AAC帧对应的采样样本的个数/采样频率

        当前AAC一帧的播放时间是= 1024*1000000/44100= 22.32ms(单位为ms)

2 、MP3

mp3 每帧均为1152个字节, 则:

         frame_duration = 1152 * 1000000 / sample_rate

例如:sample_rate = 44100HZ时, 计算出的时长为26.122ms,这就是经常听到的mp3每帧播放时间固定为26ms的由来。
 

发布了538 篇原创文章 · 获赞 1318 · 访问量 194万+

猜你喜欢

转载自blog.csdn.net/fanyun_01/article/details/103599027