音视频¶
音视频同步¶
音视频向系统时钟同步¶
当当前音视频时间戳大于系统时钟时, 让解码线程休眠直到时间戳与系统时钟对齐
C++ | |
---|---|
音频向视频同步¶
视频有固定的刷新频率,根据fps确定每帧的渲染时长。当音频时间戳大于视频时间戳(或超过某一阈值),音频播放器插入静音帧或者休眠或者放慢速度,反之。需要 跳帧、丢帧或者加快播放。
视频向音频同步¶
【更常用】因为人耳对声音变化比眼睛对图像变化更敏感
音频按照固定的采样率播放,当视频时间戳大于音频你时间戳时,渲染器不进行渲染或者重复上一帧,反之,进行跳帧
PTS与DTS¶
- PTS是显示时间戳,DTS是解码时间戳,用于指导播放器的行为,在编码时生成。在ts流中,的pes header上含有pts/dts的标识
其中pts和dts均占40位(5个字节)但实际只有33位,结构如图
ts中的pts/dts的时间基准均为{1, 90000}
,因此结构中的pts = 0x21000f9951
,按照上述提取其中的33位即为0x3cca8 = 249000
,也就是249000 / 90000 = 2.766s
音频帧率¶
音频帧率与编码格式有关,比如AAC格式,一般是1024个采样点(1024SPF)为一帧;mp3每帧为1152个采样点。
那么,采样率为48000hz的AAC音频每帧的播放时间为 1024 / 48000 * 1000 = 21.33 ms,帧率就是 1 / (每帧播放时间) = 46.875(FPS)
fdk-aac¶
aacDecoder
的buffer
是2048 * channels * sizeof(INT_PCM)
(但不清楚为什么是2048)aacEncoder
的numInSamples
是1024 * channels
,buffer
是maxOutBufBytes * channels * 2
(这个2应该是sizeof(INT_PCM)
,maxOutBufBytes
好像是1536比1024大但比2048小)