前言:
上一篇文章,我们利用live555建立RTSP客户端,能够拉取IPC输出的RTSP协议,并能够打印出每一帧音视频数据包。《编译live555》
问题:
后来,终于发现:在获取数据2小时之后的某个时间点,时间戳从一直增长,突然变成了0,自然会造成播放器发生卡顿现象。
进一步排查,将问题定位到 void DummySink::afterGettingFrame() 函数。将每一帧的时间戳计算方式进行了思路调整。
解决:
错误的思路代码(使用IPC封装的每帧时间戳,会发生跳变)
// 使用RTSP协议传递过来的时间戳进行时间戳计算...
if((fSTimeVal.tv_sec <= 0) && (fSTimeVal.tv_usec <= 0)) {
fSTimeVal = presentationTime;
}
// 计算时间戳(毫秒),tv_sec是秒,tv_usec是微秒...
dwTimeStamp = uint32_t((presentationTime.tv_sec - fSTimeVal.tv_sec)*1000.0f + (presentationTime.tv_usec - fSTimeVal.tv_usec)/1000.0f);
正确的思路代码(使用本地自己计算的时间戳,不会跳变)
// 把第一帧时间戳作为起点时间...
uint32_t dwTimeStamp = 0;
ULARGE_INTEGER llTimCountCur = {0};
// 得到当前时间,时间单位是0.1微妙...
::GetSystemTimeAsFileTime((FILETIME *)&llTimCountCur);
if( m_llTimCountFirst.QuadPart <= 0 ) {
m_llTimCountFirst.QuadPart = llTimCountCur.QuadPart;
}
// 计算时间戳(毫秒),需要除以10000...
dwTimeStamp = (llTimCountCur.QuadPart - m_llTimCountFirst.QuadPart)/10000;
注意:这里使用的是 ::GetSystemTimeAsFileTime() 能够精确到0.1微妙,音视频数据帧使用的时间戳是毫秒但闻,转换成毫秒需要除以10000
最后,经过这样的时间戳改造之后,IPC长时间直播过程中,时间戳不会发生跳变,播放端保持稳定。
更多信息:
************************************************************************************************************************