解决与RTMP服务端的通信算是完成了一大步,接下来问题又来了。
音视频在直播了十分钟后,发现了明显的不同步,差距基本在一秒左右。接着再直播半个小时,差距到了5秒钟了。
脑子里马上反应出来,这个问题肯定是音、视频时间戳的问题。
检查代码流程,视频的时间戳是采集到时候自己打上的。音频的时间戳是ffmpeg自动累加的。
声音来的速度应该是由声卡时钟来决定,视频时间戳我用的是timegettime,这个可能是主板的时钟芯片提供的,可能是这两个时钟有点误差吧。
解决办法是声音时间戳不动,用视频来和声音的时间戳同步。
如何得到声音时间戳呢?一开始的办法是用计算的方式,因为采样率,通道数,这些东西都能够得到,那就能通过采集到的声音数据直接得到视频应该播放的时间戳了。但是后来感觉算来算去好麻烦,这样又打起了ffmpeg的主意了。
那里面果然有解决的办法。
得到已经写入的视频时间戳的办法
(double)m_pVideoStream->pts.val * m_pVideoStream->time_base.num / m_pVideoStream->time_base.den * 1000; //m_pVideoStream就是前面添加视频流时,调用avformat_new_stream的返回值,乘以1000得到是毫秒
得到已经写入的音频时间戳的办法
(double)m_pAudioStream->pts.val * m_pAudioStream->time_base.num / m_pAudioStream->time_base.den * 1000;//m_pAudioStream就是前面添加音频流时,调用avformat_new_stream的返回值
在写视频帧的时间,调用以上方法得到两个时间戳,然后比较一下,如果大于一个预设值(我的预设是500毫秒),就调整视频帧的写入时间戳,让两个时间戳逐渐靠近,不要一下就对齐,那样视频会卡一下,看着不舒服。