先看看下面的这个帧
FLV rtmp 里存在B帧的情况下 time stamp 时间戳
http://blog.csdn.net/wzw88486969/article/details/62229133
按照上面的帧计算出来的 CTS也发出去了,可是播放端总报错,各种怀疑PTS DTS CTS问题,先上传我的PTS DTS的打法
CMTime pts = CMSampleBufferGetOutputPresentationTimeStamp(sampleBuffer);
CMTime dts = CMSampleBufferGetOutputDecodeTimeStamp(sampleBuffer);
if (dts.value ==0) {
dts = pts;
}
double dPTS = (double)(pts.value) / pts.timescale * 1000 ;
double dDTS = (double)(dts.value) / pts.timescale * 1000;
pPkt->i64Pts = dPTS ;
pPkt->i64Dts = dDTS ;
然后看推流端和播放端DTS PTS是否能对上
图片放大了看清楚,最上面的是播放器PTS DTS,下面的是XCODE推流打的PTS DTS,分析日志发现传的没有错,还原出来的DTS PTS都能对上,说明用
FLV TimeStamp = DTS CTS = PTS - DTS 这样传是对的,可是FFMPEG日志报错,最后顺着FFMPEG代码
if (cur_pkt.pts != AV_NOPTS_VALUE &&
cur_pkt.dts != AV_NOPTS_VALUE &&
cur_pkt.pts < cur_pkt.dts) {
av_log(s, AV_LOG_WARNING,
"Invalid timestamps stream=%d, pts=%s, dts=%s, size=%d\n",
cur_pkt.stream_index,
av_ts2str(cur_pkt.pts),
av_ts2str(cur_pkt.dts),
cur_pkt.size);
}
发现一句cur_pkt.pts < cur_pkt.dts,是不是CTS不能小于 0 ?
//统一加 5试试
double dPTS = (double)(pts.value + 5) / pts.timescale *1000 ;
double dDTS = (double)(dts.value) / pts.timescale * 1000;
这样之后播放端一切正常!!这个加上5视自己的情况而定,这个值会影响播放端AV同步,越小越好。