网站推广公司 wordpress,求合伙人做网站,莱芜都市网二手市场,品牌推广策略与方式介绍 在本系列#xff0c;我打算花大篇幅讲解我的 gitee 项目音视频播放器#xff0c;在这个项目#xff0c;您可以学到音视频解封装#xff0c;解码#xff0c;SDL渲染相关的知识。您对源代码感兴趣的话#xff0c;请查看基于FFmpeg和SDL的音视频播放器
如果您不理解本… 介绍 在本系列我打算花大篇幅讲解我的 gitee 项目音视频播放器在这个项目您可以学到音视频解封装解码SDL渲染相关的知识。您对源代码感兴趣的话请查看基于FFmpeg和SDL的音视频播放器
如果您不理解本文可参考我的前一篇文章音视频项目—基于FFmpeg和SDL的音视频播放器解析十一 解析 我们今天要讲的和音视频同步有关其中 async 主要负责时间的控制未来 audiooutput 和 videooutput 这两个负责播放音频和视频的文件就依赖其实现音视频同步。
我们先看看 async 的代码
#ifndef AVSYNC_H_
#define AVSYNC_H_#includechrono
#includectime
#includetime.h
#includemath.h
using namespace std::chrono;class AVSync
{
public:AVSync();void InitClock(){}void SetClockAt(double pts, double time){this-pts pts;pts_drift this-pts - time;}double GetClock(){double time GetMicroseconds() / 1000000.0;return pts_drift time;}double SetClock(){double time GetMicroseconds() / 1000000.0;SetClockAt(pts, time);}time_t GetMicroseconds(){system_clock::time_point time_point_new system_clock::now();system_clock::duration duration time_point_new.time_since_epoch();time_t us duration_castmicroseconds(duration).count();return us;}double pts 0;double pts_drift 0;
};#endif
这个代码量不大成员变量有 ptspts_drift 这两个。成员函数主要是 GetMicrosecondsSetClockGetClockSetClockAt我们接下来逐步解析。
我们先说成员变量的含义。ptspresentation timestamp了解音视频的朋友应该知道这是显示时间戳表示帧应该在屏幕显示的时间。pts_drift当前 pts 与系统时间的差值。
然后我们看一下函数
GetMicroseconds
time_t GetMicroseconds(){system_clock::time_point time_point_new system_clock::now();system_clock::duration duration time_point_new.time_since_epoch();time_t us duration_castmicroseconds(duration).count();return us;
}
这个函数负责获取时间的间隔。
首先第一行system_clock::time_point time_point_new system_clock::now()我们获取了当前的时间。
然后system_clock::duration duration time_point_new.time_since_epoch()通过这个函数我们获得了时间间隔。注意先是得到 time_piont我们才能计算 duration。
最后time_t us duration_castmicroseconds(duration).count()转换成毫秒并返回。 SetClockAt
void SetClockAt(double pts, double time){this-pts pts;pts_drift this-pts - time;
}
这个函数负责给 pts 和 pts_drift 赋值。这很好理解因为 pts_drift 就是 pts 和当前时间的差值。 GetClock
double GetClock(){double time GetMicroseconds() / 1000000.0;return pts_drift time;
}
这个函数负责获取时间。获取了时间间隔后加上 pts_stamp 后就返回这个值。 SetClock
double SetClock(){double time GetMicroseconds() / 1000000.0;SetClockAt(pts, time);
}
这个函数负责设置设置时钟获取时间间隔然后调用 SetClockAt 后就可以了。
我们这篇文章就讲讲了时间设置的操作并没有深入讲音视频同步的原理。我们最后通过 audiooutput 和 videooutput 播放出音视频就好了到时候也会深入讲同步机制的。
欲知后事如何请听下回分解。