RTMP客户端的开发(二)

解决与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毫秒),就调整视频帧的写入时间戳,让两个时间戳逐渐靠近,不要一下就对齐,那样视频会卡一下,看着不舒服。


实验结果是播放了两个小时,音视频还是同步的。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值