就一个函数exp()
锚定音频,音频速度始终为1,不管它
主要调节画面刷新速度
int64_t lastTime=0;
float frame_pts = 0.f;//视频时间戳
int frame_idx = 0;
float audio_time = 0.f;//音频时间戳
float timeDiff =1.;//音画时间差
while (!glfwWindowShouldClose(window)) {
int64_t time_us = std::chrono::duration_cast<std::chrono::microseconds>(std::chrono::system_clock::now().time_since_epoch()).count();
frame_pts = vp.currentTime / 1.e6; //转float秒
audio_time = sound.getTime()/44100.f;//转float秒
timeDiff = frame_pts - audio_time; //音画时间差
if ( time_us - lastTime > static_cast<int64_t>(1e6 / 30 * expf(timeDiff))) {
lastTime = time_us;
if (playPause)update_video(); //更新视频帧
}
}
没加exp()播放200秒,音画就差了12秒
给画面更新速度加个exp(),0.1秒内浮动
只要音频是线性时间,音画总是逼近一比一